/**
1Led硬件原理簡單介紹
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小燈和一個無限大的電阻上,電流為零,小燈就會滅。
2Led管腳的調用、賦值以及配置
涉及GPIO調用、賦值以及配置的函數
2.1GPIO申請和釋放函數
想用使用任何一個GPIO都必須先申請。
在頭文件“include/linux/gpio.h”中有Linux默認的GPIO申請函數,這個頭文件是屬於嵌入式Linux平台,任何一個嵌入式Linux內核都可以這么使用。
如下圖所示,在源碼目錄中使用命令“vim include/linux/gpio.h”打開該文件。
如下圖所示,就是本節實驗中需要用到的函數gpio_request。
如上圖所示,簡單介紹一下gpio_request函數。
首先這個函數有一個重要的“檢測”功能,就是如果其它地方申請了這個IO,那么這里就會返回錯誤,提示已經被占用了,這是一個標准用法。
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。
2.2GPIO配置參數宏定義
GPIO在Linux初始化,進行映射之后調用GPIO操作函數對GPIO宏定義進行操作就是對GPIO的操作。
這個GPIO宏定義文件都是由原廠提供,肯定是已經做好的,屬於BSP板級開發包。
如下圖所示,在源碼目錄中使用命令
“vim arch/arm/mach-exynos/include/mach/gpio-exynos4.h”打開該文件。
如下圖所示,可以看到所有的GPIO都已經定義了。
我們在原理圖中查找KP_COL0、VDD50_EN網絡,最終連接到4412上的部分如下圖所示。
2.3GPIO配置函數和參數
在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宏定義。
本人文字水平有限,所以就一步一步的寫和截圖,希望這種形式對大家有所幫助!
本文只對系統函數,基礎知識進行分析,如果想要獲得led/GPIO操作的驅動、Makefile文件和在無界面最小Linux系統下的應用
請參考本人另一篇原創博客:調試exynos4412—ARM嵌入式Linux—LEDS/GPIO驅動之二