經過前面的學習,我們了解了驅動開發的框架,本章節將帶領大家實驗操作,寫最簡單的驅動-helloworld。 Linux 設備驅動會以內核模塊的形式出現,因為 linux 內核的整體架構就非常龐大,包含的組件也非常多,如果把所有的功能都編譯到 linux 內核中會使得內核非常臃腫,為了解決這個問題,更方便地新增和刪除功能,linux 提供了這樣的機制,這種機制被稱為模塊。為了大家對模塊有一個感性的認識,我們先來看一個最簡單的驅動-helloworld。 驅動分為四個部分: 頭文件 驅動模塊的入口函數和出口函數 聲明信息 功能實現 我們在 windows 上面新建一個 helloworld.c 文件,這里使用 sourceinsight 來編輯文件,大家也可以用其他編譯器來編寫程序。 第一步 包含頭文件 #include #include 第二步 驅動模塊的入口函數和出口函數 module_init(); module_exit(); 第三步 聲明模塊擁有開源許可證 MODULE_LICENSE("GPL"); 第四步 功能實現:內核模塊加載的時候打印 hello world! ,內核模塊卸載的時候打印 gooodbye! 注意:內核打印函數不能用 printf,因為內核沒有辦法使用 C 語言庫。 static int hello_init(void){ printk("hello world! \n"); return 0; } static void hello_exit(void){ printk("gooodbye! \n"); } 完整的一個最簡單的 Linux 內核模塊,如下圖所示: ![]() 此時,我們需要有一個感性認識,代碼中的某些陌生元素都是 linux 內核為了字符設備定義的,以實現驅動與內核接口而定義的。Linux 對各類設備的驅動都定義了類似的數據結構和函數。 ![]() 核心板參數 尺寸:38mm*42mm PCB:6層 CPU:iMX6ULL ARM Cortex-A7架構 單核 iMX6ULL 商業級 內存:512M 存儲:8G EMMC iMX6ULL 工業級 內存:256M 存儲:512M FLASH 工作電壓:5V~16V 電壓供電 系統支持:Linux-QT系統;Ubuntu core系統;Youcto系統;Buildroot系統; 商業級運行溫度:-20℃ ~ +80℃ 工業級運行溫度:-40℃ ~ +80℃ 引腳間距:1.27mm 引角擴展:i.MX6功能全部引出,146PIN腳 連接方式:郵票孔 底板參數 尺寸:12*19cm PCB:2層 POWER:5V~16V電壓供電 SWITCH:電源開關 EEPROM 存儲:256字節,掉電后數據不丟失 4G模塊:1個 全網通 (選配) WIFI藍牙模塊:WIFI/藍牙二合一模塊,工作頻段 2.4GHz,支持 IEEE802.11bgn 等標準,支持藍牙 4.0 協議。 LVDS接口:1路(一個是標準HDMI 座(CON3),另一個是 30pin 的 FPC 座(J18), 兩個接口實際上是同一路 LVDS 信號,用來連接迅為電子的 LVDS 屏幕) RGB接口:1路 CAN:2 路 CAN 總線接口 RS485:1 路 RS485 總線接口 MIC:支持錄音輸入 PHONE:支持耳機輸出 USB OTG:1路 USB HOST:2路 USB-UART:1路 mini HDMI:1個(一路標準MINI-HDMI 接口,i.MX6ULL處理器本身沒有支持HDMI,通過一個 RGB 轉 HDMI 的芯片擴展出HDMI接口,通過該接口來連接HDMI顯示器。 ) 網口:2路百兆以太網,RJ45 接口 TF卡槽:1個標準TF卡接口 SIM卡槽:1個標準SIM卡接口 T&H接口:溫濕度傳感器接口 TTL/RS485接口:TTL/RS485接口二選一 BUZZER:1個蜂鳴器 IRDA:1個紅外一體化接收頭 ADC電位器:支持 DIP SWITCH:8位撥碼開關 JTAG:1個(可以通過下載/調試器來調試 i.MX6ULL 處理器) CAMERA接口:1個 支持500萬攝像頭 TTL串口接口:20PIN (gpio引出:兩個ad,一個spi,一路ttl。一路i2c,5個gpio,5v,3.3v電源) GPIO接口:20PIN(包括:兩路ADC,一路SPI,5個GPIO,一路TTL串口,一路I2C接口。) 重力加速度傳感器:支持 紅外接收模塊:支持 光環境傳感器:支持 實時時鐘:斷電后系統時間不丟失 LED:2個 按鍵:3個 |