3 驅動程序的設計
智能家居控制器要多個設備驅動程序,有的驅動程序可以采用標準的驅動程序,有的要專門設計。芯片SIM100-E是通過第三個串口與S3C2410相連的,所以可以直接使用標準的串口驅動程序。傳感器接口和家電控制接口要設計專用的驅動程序。控制器的處理器通過外部中斷來檢測傳感器,通過GPIO端口來控制家電,雖然它們的工作原理有所不同,但驅動程序設計的方法沒有很大差別,因為在嵌入式Linux系統中設備驅動程序有一個標準的框架,設計驅動程序的大部分工作就是根據硬件結構來“填寫”框架中的函數。主要的函數包括open()、read()、write()、ioctl()、release()、module_init()和module_exit()等等。
下面以傳感器接口驅動程序設計為例,簡介驅動程序的“填寫”過程。
3.1 設備初始化模塊和退出模塊
設備初始化模塊的主要功能是:設置和申請中斷、向內核注冊設備等。設備退出模塊的主要功能是:釋放設備所占
用的資源。具體函數如下:
int __init s3c2410_int_init(void)
{┅
set_external_irq(IRQ_EINT9, ┅);//設置外部中斷
request_irq(IRQ_EINT9,demo_int_handler, ┅);//申請外部中斷
ret = register_chrdev(0, DEVICE_NAME, &s3c2410_exio_fops); //申請主設備號
devfs_int_demo= devfs_register(NULL, “int_demo”, ┅); //注冊設備文件
┅}
void __exit s3c2410_int_exit(void)
{┅
free_irq(IRQ_EINT9,NULL);//釋放中斷
devfs_unregister(devfs_int_demo); //刪除設備文件
unregister_chrdev(exioMajor, DEVICE_NAME); //釋放主設備號
┅}
3.2 打開模塊和釋放模塊
打開模塊的主要功能是:初始化一些變量。具體實現函數如下:
static int s3c2410_int_open(struct inode *inode, struct file *filp)
{ init_MUTEX(&demodev.lock);//初始化自旋鎖
init_waitqueue_head(&(demodev.wait));初始化隊列
MOD_INC_USE_COUNT;//使用計數加1
┅}
static int s3c2410_int_release(struct inode *inode, struct file *filp)
{ MOD_DEC_USE_COUNT; //使用計數減1
┅}
3.3 讀數據模塊
讀數據模塊的主要功能是:使線程休眼,然后等待中斷來喚醒。具體實現函數如下:
static int s3c2410_int_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
{┅
copy_to_user(buffer,(char *)&bak,sizeof(bak)); //內核態到用戶態
interruptible_sleep_on(&demodev.wait);//進入休眠
┅}
3.4 中斷處理模塊
中斷處理模塊的主要功能是:喚醒正在休眼的線程。具體實現函數如下:
static void s3c2410_int_handler(int irq, void *dev_id, struct pt_regs *reg)
{wake_up(&demodev.wait);//中斷喚醒
┅}
驅動程序設計完成后,再編寫Makefile文件,通過make命令生成目標文件,最后利用insmod命令向內核加載驅動程序。
4 應用程序的設計
為了提高應用程序的運行速度,以及程序運行的穩定性,所以將應用程序設計成多線程結構,如圖2所示。應用程序由7個線程和一個共享數據結構組成。
如圖2 應用程序結構框圖
共享數據主要用于存放家電開啟和關閉時間,發送短信的電話號和短信內容等信息。共享數據是通過2個設置線程來修改的。家電控制線程主要是根據控制數據、檢測短信線程的內容和操作線程的內容來進行操作。發送短信線程主要是根據控制數據、檢測傳感器線程的內容和操作線程的內容來進行操作。應用程序的具體內容如下。
#include &nb
sp; //線程庫頭文件
┅
int main()
{┅
pthread_creat(&th_a,NULL,send_msg,0); //創建發送短信線程
pthread_creat(&th_b,NULL,control_driver,0); //創建家電控制線程
┅
pthread_join(th_b,&retval); //等待家電控制線程結束
pthread_join(th_a,&retval); //等待發送短信線程結束
┅}
/*發送短信線程*/
int send_msg()
{┅
tty_init(); //初始化串口
gprs_init(); //初始化GPRS模塊
tty_writecmd(“at”,strlen(“at”)); //發送AT命令
tty_writecmd(“at+cmgf=1”,strlen(“at+cmgf=1”));//發送修改字符集命令
tty_write(“at+cmgs=”,strlen(“at+cmgs=”)); //發送短信命令
tty_writecmd(msg.send_tel,strlen(msg.send_tel)); //發送電話號碼
tty_writecmd(msg.send_text,strlen(msg.send_text)); //發送短信內容
tty_end();
┅
return 0;
}
其它線程的設計方法有很多相似之處。應用程序設計完成之后,再經過交叉編譯就可生成目標文件。
5 結束語
將移植好的系統、驅動程序和應用程序下載到智能家居控制器上。經過測試,系統具有操作方便、可靠性高和抗干擾能力強等優點。本文的創新點是:通過智能家居控制器將家電、傳感器、手機等許多獨立的設備連接成為一個系統,從而方便本地和遠程控制。
評論
查看更多