智慧家居實訓第七天 驅動使用
一、嵌入式領域 軟體開發 -----》linux環境/邏輯/演算法(上層應用) 系統開發 -----》linux核心運維(shell指令碼) 驅動開發 -----》電路分析/硬體構造/驅動設計 二、LED燈 驅動工程師: 1)驅動原始碼:led.c 2)驅動檔案:ked.ko 三、軟體應用層如何去使用底層的驅動? 1.分析原始碼led.c 1.1驅動裡面沒有主函式(main) 應用層才會出主函式 1.2驅動中輸入字串使用的是printk(); 檢視列印等級: cat /proc/sys/kernel/printk 7 7 1 7 #define KERN_EMERG "<0>" /* system is unusable */ /*緊急事件訊息,系統崩潰之前提示,表示系統不可用*/ #define KERN_ALERT "<1>" /* action must be taken immediately */ /*報告訊息,表示必須立即採取措施*/ #define KERN_CRIT "<2>" /* critical conditions */ /*臨界條件,通常涉及嚴重的硬體或軟體操作失敗*/ #define KERN_ERR "<3>" /* error conditions */ /*錯誤條件,驅動程式常用KERN_ERR來報告硬體的錯誤*/ #define KERN_WARNING "<4>" /* warning conditions */ /*警告條件,對可能出現問題的情況進行警告*/ #define KERN_NOTICE "<5>" /* normal but significant condition */ /*正常但又重要的條件,用於提醒*/ #define KERN_INFO "<6>" /* informational */ /*提示資訊,如驅動程式啟動時,列印硬體資訊*/ #define KERN_DEBUG "<7>" /* debug-level messages */ /*除錯級別的訊息*/ 應用層中輸出字串使用的是printf();
2.led.c結構
1)初始化函式 module_init(led_init); 2)為4盞燈LED申請GPIO口 gpio_request(led_gpios[i].gpio, led_gpios[i].name); 3)把4個GPIO口設定為輸出模式 gpio_direction_output(led_gpios[i].gpio,0); 4)註冊一個雜項裝置(結構體) misc_register(&gec6818_led_dev);
5)定義的雜項裝置的成員 static struct miscdevice gec6818_led_dev = { .minor = MISC_DYNAMIC_MINOR,//動態分配裝置號 .name = DEVICE_NAME,//led裝置節點檔名字 .fops = &gec6818_led_dev_fops,//檔案操作集 };
6)檔案操作集(驅動提供給函式介面 應用程式)
static struct file_operations gec6818_led_dev_fops = {
.owner = THIS_MODULE, //模式狀態
.open = led_open, //開啟對應的gpio
.unlocked_ioctl = gec6818_leds_ioctl,
//當你的應用程式呼叫ioctl函式是,驅動就會對應的gec6818_leds_ioctl
};
7)為GPIO口號設定值
gpio_set_value(led_gpios[_IOC_NR(cmd)].gpio, arg);
驅動解除安裝時:
8)在核心登出模組
module_exit(gec5260_led_dev_exit);
9)釋放所有的GPIO口的資源
gpio_free(led_gpios[i].gpio);
10)移除雜項裝置
misc_deregister(&gec6818_led_dev);
四、如何去安裝/解除安裝驅動?
4.1 首先下載驅動映象檔案led.ko到6818開發平臺
4.2 檢視當期的開發板有沒有安裝過驅動
lsmod ----》檢查當前有沒有安裝驅動
4.3 安裝led驅動
insmod led.ko