欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

基于OMAPL138的Linux設(shè)備驅(qū)動(dòng)程序開發(fā)怎么入門

本篇文章為大家展示了基于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ū)。

LED設(shè)備驅(qū)動(dòng)程序

 LED設(shè)備驅(qū)動(dòng)程序解析

開發(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è)備框架,這里稍微說明一下:

  1. Linux的LED設(shè)備類在內(nèi)核"Documentation/leds/leds-class.txt"文件有詳細(xì)說明。

  2. 注冊(cè)一個(gè)LED設(shè)備成功后,會(huì)"/sys/class/leds/"生成相應(yīng)的設(shè)備節(jié)點(diǎn)。

  3. 用戶可以通過讀寫節(jié)點(diǎn)目錄下的brightness文件控制LED亮滅。

對(duì)于GPIO口的操作,有以下幾點(diǎn)步驟:

  1. 查看開發(fā)板的原理圖,找到與LED連接的GPIO。TL138/1808-EVM開發(fā)板與LED連接的GPIO分別是GPIO0[5]、GPIO0[0]、GPIO0[1]、GPIO0[2]。

  2. 查看OMAP-L138的數(shù)據(jù)手冊(cè),查找對(duì)應(yīng)PINMUX寄存器的地址,將對(duì)應(yīng)的管腳的寄存器中相應(yīng)位設(shè)置為GPIO的工作模式。本例中使用的是PINMUX1。

  3. 設(shè)置GPIO的方向寄存器。本例程中將GPIO口配置為輸出。

  4. 配置GPIO的數(shù)據(jù)寄存器,寫"1"表示輸出高電平,寫"0"表示輸出低電平。

編譯LED設(shè)備驅(qū)動(dòng)程序

此處使用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

基于OMAPL138的Linux設(shè)備驅(qū)動(dòng)程序開發(fā)怎么入門

圖 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

基于OMAPL138的Linux設(shè)備驅(qū)動(dòng)程序開發(fā)怎么入門

圖 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-

基于OMAPL138的Linux設(shè)備驅(qū)動(dòng)程序開發(fā)怎么入門

圖 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)核

假如需要將設(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)容:

基于OMAPL138的Linux設(shè)備驅(qū)動(dòng)程序開發(fā)怎么入門

圖 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

基于OMAPL138的Linux設(shè)備驅(qū)動(dòng)程序開發(fā)怎么入門

圖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),如下圖:

基于OMAPL138的Linux設(shè)備驅(qū)動(dòng)程序開發(fā)怎么入門

圖 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)

成都網(wǎng)站建設(shè)