本篇文章為大家展示了基于OMAPL138的Linux設(shè)備驅(qū)動(dòng)程序開發(fā)怎么入門,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
站在用戶的角度思考問題,與客戶深入溝通,找到本溪網(wǎng)站設(shè)計(jì)與本溪網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋本溪地區(qū)。
開發(fā)板LED編號(hào)和GPIO對(duì)應(yīng)關(guān)系如下:
表 1
開發(fā)板型號(hào) | GPIO0[0] | GPIO0[5] | GPIO0[1] | GPIO0[2] |
TL138/1808-EVM | D7 | D6 | D9 | D10 |
TL138/1808-EasyEVM | D7 | D6 | D9 | D10 |
TL138/1808-EthEVM | D7 | D6 | D9 | D10 |
TL138/1808F-EasyEVM | \ | GD1 | GD2 | GD3 |
TL138/1808F-EVM | \ | D1 | D2 | D3 |
開發(fā)板資料光盤中有LED設(shè)備驅(qū)動(dòng)程序源碼,其路徑為:
led.c:demo\driver\linux-3.3\led\led.c
下面以TL138/1808-EVM開發(fā)板為例講解此設(shè)備驅(qū)動(dòng)程序。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/gpio.h>
#include <linux/platform_device.h>
/* 因?yàn)槭褂昧似脚_(tái)相關(guān)的頭文件,所以編譯時(shí)需要ARCH=arm */
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <mach/da8xx.h>
#include <mach/mux.h>
/*定義4個(gè)用戶LED對(duì)應(yīng)的GPIO,開發(fā)板LED對(duì)應(yīng)編號(hào)分別是D7,D6,D9,D10 */
#define DA850_USER_LED0 GPIO_TO_PIN(0, 0)
#define DA850_USER_LED1 GPIO_TO_PIN(0, 5)
#define DA850_USER_LED2 GPIO_TO_PIN(0, 1)
#define DA850_USER_LED3 GPIO_TO_PIN(0, 2)
/* assign the tl som board LED-GPIOs*/
static const short da850_evm_tl_user_led_pins[] = {
/* These pins are definition at <mach/mux.h> file */
DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_5,
-1
};
/*定義4個(gè)LED對(duì)應(yīng)的GPIO號(hào)、有效電平(熄燈電平)、名稱、觸發(fā)模式等*/
/*使用Linux提供的標(biāo)準(zhǔn)gpio-led框架*/
static struct gpio_led da850_evm_tl_leds[] = {
{
.active_low = 0, /*有效電平(熄燈電平):低電平*/
.gpio = DA850_USER_LED0, /*GPIO號(hào):LED對(duì)應(yīng)gpio管腳*/
.name = "user_led0", /*名稱:對(duì)應(yīng)/sys/class/leds/下的名稱*/
.default_trigger = "default-on", /*觸發(fā)模式:默認(rèn)點(diǎn)亮*/
},
{
.active_low = 0,
.gpio = DA850_USER_LED1,
.name = "user_led1",
.default_trigger = "default-on",
},
{
.active_low = 0,
.gpio = DA850_USER_LED2,
.name = "user_led2",
.default_trigger = "default-on",
},
{
.active_low = 0,
.gpio = DA850_USER_LED3,
.name = "user_led3",
.default_trigger = "default-on",
},
};
static struct gpio_led_platform_data da850_evm_tl_leds_pdata = {
.leds = da850_evm_tl_leds,
.num_leds = ARRAY_SIZE(da850_evm_tl_leds),
};
static void led_dev_release(struct device *dev)
{
};
/*使用Linux提供的標(biāo)準(zhǔn)platform_device 框架*/
static struct platform_device da850_evm_tl_leds_device = {
.name = "leds-gpio",
.id = 1, /*先確定id號(hào)是否被使用,此id是platform_device的id,跟LED個(gè)數(shù)無關(guān)*/
.dev = {
.platform_data = &da850_evm_tl_leds_pdata,
.release = led_dev_release,
}
};
static int __init led_platform_init(void)
{
int ret;
#if 0
/*使用davinci pinmux設(shè)置接口,把LED對(duì)應(yīng)的管腳配置成gpio模式*/
ret = davinci_cfg_reg_list(da850_evm_tl_user_led_pins);
if (ret)
pr_warning("da850_evm_tl_leds_init : User LED mux failed :"
"%d\n", ret);
#endif
/*注冊(cè)LED device設(shè)備,系統(tǒng)LED框架將會(huì)接收到這個(gè)注冊(cè),生成相應(yīng)LED節(jié)點(diǎn)*/
ret = platform_device_register(&da850_evm_tl_leds_device);
if (ret)
pr_warning("Could not register som GPIO expander LEDS");
else
printk(KERN_INFO "LED register sucessful!\n");
return ret;
}
static void __exit led_platform_exit(void)
{
platform_device_unregister(&da850_evm_tl_leds_device);
printk(KERN_INFO "LED unregister!\n");
}
module_init(led_platform_init);
module_exit(led_platform_exit);
MODULE_DESCRIPTION("Led platform driver");
MODULE_AUTHOR("Tronlong");
MODULE_LICENSE("GPL");
以上是LED設(shè)備驅(qū)動(dòng)程序解析,對(duì)于Linux對(duì)LED設(shè)備框架,這里稍微說明一下:
Linux的LED設(shè)備類在內(nèi)核"Documentation/leds/leds-class.txt"文件有詳細(xì)說明。
注冊(cè)一個(gè)LED設(shè)備成功后,會(huì)"/sys/class/leds/"生成相應(yīng)的設(shè)備節(jié)點(diǎn)。
用戶可以通過讀寫節(jié)點(diǎn)目錄下的brightness文件控制LED亮滅。
對(duì)于GPIO口的操作,有以下幾點(diǎn)步驟:
查看開發(fā)板的原理圖,找到與LED連接的GPIO。TL138/1808-EVM開發(fā)板與LED連接的GPIO分別是GPIO0[5]、GPIO0[0]、GPIO0[1]、GPIO0[2]。
查看OMAP-L138的數(shù)據(jù)手冊(cè),查找對(duì)應(yīng)PINMUX寄存器的地址,將對(duì)應(yīng)的管腳的寄存器中相應(yīng)位設(shè)置為GPIO的工作模式。本例中使用的是PINMUX1。
設(shè)置GPIO的方向寄存器。本例程中將GPIO口配置為輸出。
配置GPIO的數(shù)據(jù)寄存器,寫"1"表示輸出高電平,寫"0"表示輸出低電平。
此處使用Makefile編譯LED設(shè)備驅(qū)動(dòng)程序。工程中源文件有時(shí)候很多,其按類型、功能、模塊分別放在若干個(gè)目錄中,Makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進(jìn)行更復(fù)雜的功能操作,因?yàn)镸akefile就像一個(gè)Shell腳本一樣,其中也可以執(zhí)行操作系統(tǒng)的命令。
開發(fā)板資料光盤中有LED設(shè)備驅(qū)動(dòng)程序Makefile文件,其路徑為:
Makefile: demo\driver\linux-3.3\led\Makefile
以下為L(zhǎng)ED設(shè)備驅(qū)動(dòng)程序Makefile文件的解析:
ifneq ($(KERNELRELEASE),)
obj-m := led.o /*定義了要編譯的驅(qū)動(dòng)文件為led.c,生成的模塊名字為led.ko*/
else
/*以下定義運(yùn)行編譯命令時(shí)使用的內(nèi)核源碼、驅(qū)動(dòng)源碼路徑、平臺(tái)、使用的交叉編譯工具鏈等參數(shù)*/
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
/*定義運(yùn)行"make clean"時(shí)清除的文件*/
clean:
rm -rf *.ko *.o *.mod.o *.mod.c *.symvers modul* .button.* .tmp_versions
#help: make KDIR=<you kernel path>
endif
圖 1
將光盤"demo\driver\linux-3.3\led"的led.c和Makefile文件復(fù)制到開發(fā)系統(tǒng)Ubuntu任意路徑,并在led.c和Makefile目錄運(yùn)行以下命令編譯LED設(shè)備驅(qū)動(dòng)程序:
Host#make KDIR=/home/tl/omapl138/linux-3.3
圖 3
將光盤"demo\driver\linux-3.3\button"中的button.c和Makefile文件復(fù)制到Ubuntu任意路徑,在button.c和Makefile文件所在目錄運(yùn)行如下命令編譯按鍵設(shè)備驅(qū)動(dòng)程序:
Host#make KDIR=/home/tl/omapl138/linux-3.3 CROSS_COMPILE=arm-none-linux-gnueabi-
圖 5
可以看到在當(dāng)前目錄生成了測(cè)試程序鏡像文件button_test。具體按鍵測(cè)試步驟請(qǐng)看用戶手冊(cè)快速體驗(yàn)相關(guān)小節(jié)。
假如需要將設(shè)備驅(qū)動(dòng)程序模塊靜態(tài)編譯進(jìn)內(nèi)核,請(qǐng)按照如下步驟操作。
以LED設(shè)備驅(qū)動(dòng)程序?yàn)槔?,將光盤"demo\driver\linux-3.3\led"目錄下的設(shè)備驅(qū)動(dòng)程序源代碼led.c放到內(nèi)核源碼"drivers/char"目錄下,修改內(nèi)核源碼"drivers/char"目錄下Kconfig菜單配置文件,在"menu "Character devices""行下面添加如下內(nèi)容:
圖 6
config USER_LED:USER_LED是驅(qū)動(dòng)程序的配置名稱。
tristate "user led":在使用"make menuconfig"配置內(nèi)核時(shí)菜單欄出現(xiàn)的驅(qū)動(dòng)名字。
depends on ARM:注明是ARM平臺(tái)下的驅(qū)動(dòng)程序。
default y:默認(rèn)是靜態(tài)編譯到內(nèi)核鏡像的。
---help---:驅(qū)動(dòng)程序的補(bǔ)充信息,讓用戶進(jìn)一步了解此驅(qū)動(dòng)程序的作用。
修改內(nèi)核源碼"drivers/char"目錄下的Makefile編譯文件,在最后添加如下內(nèi)容:
obj-$(CONFIG_USER_LED) += led.o
圖7
obj-$(CONFIG_USER_LED):"USER_LED"此內(nèi)容必須和前面步驟Kconfig文件中添加的內(nèi)容一致。
+= led.o:這個(gè)前綴必須是"led",編譯驅(qū)動(dòng)程序時(shí),系統(tǒng)會(huì)去找"driver/char"目錄下的led.c文件。
在內(nèi)核源碼頂層目錄執(zhí)行以下命令查看設(shè)備內(nèi)核配置情況:
Host#make menuconfig ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
可在"device drivers->character devices"下有"user led"的驅(qū)動(dòng)配置選項(xiàng),如下圖:
圖 8
前面的"*"符號(hào)代表將設(shè)備驅(qū)動(dòng)模塊靜態(tài)編譯進(jìn)內(nèi)核。保存退出,并重新編譯內(nèi)核,然后使用編譯得到的內(nèi)核鏡像啟動(dòng)開發(fā)板,可發(fā)現(xiàn)在不用安裝led.ko的情況下,可以直接運(yùn)行l(wèi)ed_loop.sh來實(shí)現(xiàn)LED的循環(huán)點(diǎn)亮。
若需要將設(shè)備驅(qū)動(dòng)模塊編譯成內(nèi)核模塊的形式,按空格鍵將"*"變?yōu)?quot;M",變?yōu)榭毡硎静痪幾g。
上述內(nèi)容就是基于OMAPL138的Linux設(shè)備驅(qū)動(dòng)程序開發(fā)怎么入門,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前題目:基于OMAPL138的Linux設(shè)備驅(qū)動(dòng)程序開發(fā)怎么入門
分享路徑:http://chinadenli.net/article0/pijgoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、建站公司、定制網(wǎng)站、外貿(mào)建站、、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)