|
14.1 本章導讀 本節實驗介紹一個完整的 GPIO 驅動,以后在 Linux 中需要處理 GPIO 驅動都可以仿照或 者移植這個驅動。 14.1.1 工具 14.1.1.1 硬件工具 1)iTOP4412 開發板 2)U 盤或者 TF 卡 3)PC 機 4)串口 14.1.1.2 軟件工具 1)虛擬機 Vmware 2)Ubuntu12.04.2 3)超級終端(串口助手) 4)源碼文件夾“leds” 14.1.2 預備課程 實驗 12_物理地址虛擬地址 實驗 13_GPIO 初始化 14.1.3 視頻資源 本節配套視頻為“視頻 14 LEDS 驅動一” 14.2 學習目標 本章需要學習以下內容: Led 硬件原理簡單介紹 Led 管腳的調用、賦值以及配置 編寫簡單應用調用 LED 管腳,并測試 14.3 Led 硬件原理簡單介紹 Led 的電路比較簡單,一般是使用三極管搭建一個控制電路。 如下圖所示,是原理圖中兩個 Led 的控制電路。KP_COL0 和 VDD50_EN 網絡控制 Led的通斷。
如上圖所示。 當 KP_COL0 和 VDD50_EN 網絡時高電平的時候,三極管 L9014 的 BE 導通,CE 導通,相當于 5V 的 VSYS 電壓加到 1K 和 Led 小燈上,小燈就會亮。 當 KP_COL0 和 VDD50_EN 網絡時低電平的時候,三極管 L9014 的 BE 會截止,CE 截止,相當于 5V 的 VSYS 電壓加到 1K、Led 小燈和一個無限大的電阻上,電流為零,小燈就會滅。 14.4 Led 管腳的調用、賦值以及配置 本節給大家介紹一部分涉及 GPIO 調用、賦值以及配置的函數。 14.4.1 GPIO 申請和釋放函數 想用使用任何一個 GPIO 都必須先申請。 在頭文件“include/linux/gpio.h”中有 Linux 默認的 GPIO 申請函數,這個頭文件是屬于嵌入式 Linux 平臺,任何一個嵌入式 Linux 內核都可以這么使用。 如下圖所示,在源碼目錄中使用命令“vim include/linux/gpio.h”打開該文件。
如下圖所示,就是本節實驗中需要用到的函數 gpio_request。
如上圖所示,簡單介紹一下 gpio_request 函數。 首先這個函數有一個重要的“檢測”功能,就是如果其它地方申請了這個 IO,那么這里就會返回錯誤,提示已經被占用了,這是 Linux 中的一個標準用法。 gpio_request 函數有兩個參數 unsigned gpio,申請的那個 GPIO,一般是 GPIO 對應的宏定義 const char *label,為 GPIO 取個名字,便于閱讀 如下圖所示,和 gpio_request 函數對應的是 gpio_free 函數。
在調用 gpio_request 函數之后,向系統表明這個 IO 已經被占用了,在卸載驅動的時候一般需要調用 gpio_free 函數將其釋放。 gpio_free 函數的參數比較簡單,只有一個 GPIO 參數,使用 GPIO 對應的宏定義即可。 如下圖所示,還有一個賦值函數 gpio_set_value。
在將 GPIO 配置為輸出模式之后,還需要給 GPIO 賦值,一般就是高電平和低電平兩種。 兩個參數分別為 unsigned gpio,GPIO int value,高電平 1 和低電平 0。 14.4.2 GPIO 配置參數宏定義 GPIO 在 Linux 初始化,進行映射之后調用 GPIO 操作函數對 GPIO 宏定義進行操作就是對 GPIO 的操作。 這個 GPIO 宏定義文件都是由原廠提供,肯定是已經做好的,屬于 BSP 板級開發包。 如下圖所示,在源碼目錄中使用命令 “vim arch/arm/mach-exynos/include/mach/gpio-exynos4.h”打開該文件。
如下圖所示,可以看到所有的 GPIO 都已經定義了。
在原理圖中查找 KP_COL0、VDD50_EN 網絡,最終連接到 4412 上的部分如下圖所示。
如上圖所示,則兩個 Led 的宏定義為 EXYNOS4_GPL2(0),EXYNOS4_GPK1(1)。 14.4.3 GPIO 配置函數和參數 在 Linux 中,對 GPIO 的配置函數以及參數都已經集成到三星板級開發包中。 先來看一下配置函數,如下圖所示,在源碼目錄中使用命令 “vim arch/arm/plat-samsung/include/plat/gpio-cfg.h”打開該文件。
如下圖所示,s3c_gpio_cfgpin 函數就是本節實驗需要的。
如上圖所示,函數 extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to); 一般來說帶有 s3cxxx 的函數就是三星平臺能夠通用的函數。 s3c_gpio_cfgpin 管腳配置函數有兩個參數 參數 unsigned int pin,管腳 參數 unsigned int to,配置參數。 再來看一下配置參數,如下圖所示,在源碼目錄中使用命令 “vim arch/arm/plat-samsung/include/plat/gpio-cfg.h”打開該文件,配置參數和函數是在同一個函數中。
如下圖所示,對于 GPIO 需要將其配置為輸出模式,對應 S3C_GPIO_OUTPUT 宏定義。
14.5 編寫簡單應用調用 LED 管腳,并測試 在前面的 devicenode_linux_module.c 文件上添加代碼,首先將文件名devicenode_linux_module.c 改為 leds.c。 先處理一下編譯文件 Makefile,如下圖所示,將 devicenode_linux_module 改為leds。
接著修改 leds.c 文件。 首先添加需要的頭文件,如下圖所示,分別是申請 GPIO、配置函數、配置參數、GPIO宏定義等的頭文件。然后將設備節點名稱由 hello_ctl123 修改為 hello_ctl
然后需要修改的就是 probe 函數,一般說來 GPIO 的初始化都是在 probe 中。如下圖所示,調用配置函數以及配置函數。
然后就是修改一下 ioctl 函數,在 Linux 中對 GPIO 的控制一般是使用 ioctl,雖然 write函數也可以實現類似的功能,但是 ioctl 函數的效率高一些。如下圖所示,根據應用傳入的參數給 GPIO 賦值。
如上圖所示,先對于參數做一個簡單的判斷,然后給 led 賦值。 接著再來看一下應用,如下圖所示,應用比較簡單,調用延時函數,首先將 Led 點亮三秒,然后再滅掉三秒,再點亮。
在 Ubuntu 系統下新建 leds 文件夾,將寫好的 leds 和編譯腳本拷貝到 leds 文件夾下,使用 Makefile 命令編譯驅動,使用 “arm-none-linux-gnueabi-gcc -o invoke_leds invoke_leds.c -static”命令編譯應用。如下圖所示
將上圖中的文件 invoke_leds 和 leds.ko 拷貝到 U 盤。 啟動開發板,將 U 盤插入開發板,使用命令“ mount /dev/sda1 /mnt/udisk/”加載 U盤符, 使用命令“ insmod /mnt/udisk/leds.ko ”加載驅動 leds.ko, 使用命令“./mnt/udisk/invoke_leds”運行小應用 invoke_leds,如下圖所示。
經過上面的操作可觀察到 led 小燈會一亮一滅一亮,中間大概間隔三秒鐘。
|