目前的linux版本的許多驅(qū)動都是基于設(shè)備模型,LED也不例外。
簡單地說,設(shè)備模型就是系統(tǒng)認(rèn)為所有的設(shè)備都是掛接在總線上的,而要使設(shè)備工作,就需要相應(yīng)的驅(qū)動。設(shè)備模型會產(chǎn)生一個虛擬的文件系統(tǒng)——sysfs,它給用戶提供了一個從用戶空間去訪問內(nèi)核設(shè)備的方法,它在linux里的路徑是/sys。如果要寫程序訪問sysfs,可以像讀寫普通文件一樣來操作/sys目錄下的文件。
對于基于s3c2440的開發(fā)板來說,linux-3.6.6自動的LED驅(qū)動只需改變連接LED的IO端口,及高、低電平響應(yīng)即可。我的開發(fā)板的四個LED連接在了B口的5到8引腳上,當(dāng)輸出低電平時被點亮,與linux自帶的LED驅(qū)動一致,因此無需做任何改動。
使用menuconfig來配置內(nèi)核,這里要加上對LED模塊的內(nèi)容,即:
Device Drivers--->
[*]LED Support--->
<*>LED Class Support
<*>LED Support for Samsung S3C24xx GPIO LEDs
編譯內(nèi)核,并把編譯好的內(nèi)核下載到開發(fā)板上,運行:
[root@zhaocj /]#ls
bin etc lib proc sys usr
dev home linuxrc sbin temp
[root@zhaocj /]#cd sys
[root@zhaocj /sys]#ls
block class devices fs module
bus dev firmware kernel power
進(jìn)入sys目錄下,我們看到該目錄下有一些子目錄。
[root@zhaocj /sys]#cd class
[root@zhaocj class]#ls
backlight hidraw leds rtc vc
bdi hwmon mem sound video_output
block i2c-adapter misc spi_master vtconsole
firmware i2c-dev mmc_host spidev watchdog
gpio input mtd tty
graphics lcd net udc
進(jìn)入class目錄,我們會看到在該目錄下有一些設(shè)備,其中l(wèi)eds就是本次我們要操作的LED。
[root@zhaocj class]#cd leds
[root@zhaocj leds]#ls
backlight led1 led2 led3 led4
在leds目錄下,會看到四個LED的目錄,這就是開發(fā)板上的四個LED。另外backlight目錄是關(guān)于LCD的背光,與LED無關(guān)。
[root@zhaocj leds]#cd led1
[root@zhaocj led1]#ls
brightness max_brightness subsystem
device power uevent
brightness文件就是LED設(shè)備,對其進(jìn)行操作就可完成對LED的控制。
[root@zhaocj led1]#cat brightness
0
可以看出led1當(dāng)前的狀態(tài)是關(guān)閉。(0表示關(guān)閉,1表示打開)
[root@zhaocj led1]#cat >brightness< > eof #[root@zhaocj led1]# 向brightness寫1,表示打開LED。這時led1會被點亮。 當(dāng)然,我們也可以編寫用戶程序來控制開發(fā)板上的四個LED /********************** ****leds.c************** **********************/ #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd, no; /*判斷是要控制哪個LED,并打開相應(yīng)的文件*/ no=(int)argv[1][3]-48; switch(no) { case 1: fd = open('/sys/class/leds/led1/brightness', O_RDWR); break; case 2: fd = open('/sys/class/leds/led2/brightness', O_RDWR); break; case 3: fd = open('/sys/class/leds/led3/brightness', O_RDWR); break; case 4: fd = open('/sys/class/leds/led4/brightness', O_RDWR); break; default: return -1; } if(fd<0) { printf('can not open file.n'); return -1; } /*完成打開或關(guān)閉LED操作*/ if(!strcmp(argv[2],'on')) write(fd, '1', 1); else if(!strcmp(argv[2],'off')) write(fd, '0', 1); close(fd); return 0; } 上面的程序只做簡單測試之用。編譯該文件: arm-linux-gcc -o leds leds.c 把leds文件下載到temp目錄下,運行: [root@zhaocj /temp]# ./leds led2 on 則點亮led2。 [root@zhaocj /temp]# ./leds led2 off 則關(guān)閉led2。 下面我就來簡單分析一下linux自帶的LED子系統(tǒng)。 在mach-zhaocj2440.c文件,創(chuàng)建了LED設(shè)備,如下: /* LEDS */ static struct s3c24xx_led_platdata zhaocj2440_led1_pdata = { .name = 'led1', .gpio = S3C2410_GPB(5), .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, .def_trigger = 'heartbeat', }; static struct s3c24xx_led_platdata zhaocj2440_led2_pdata = { .name = 'led2', .gpio = S3C2410_GPB(6), .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, .def_trigger = 'nand-disk', }; static struct s3c24xx_led_platdata zhaocj2440_led3_pdata = { .name = 'led3', .gpio = S3C2410_GPB(7), .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, .def_trigger = 'mmc0', }; static struct s3c24xx_led_platdata zhaocj2440_led4_pdata = { .name = 'led4', .gpio = S3C2410_GPB(8), .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, .def_trigger = '', }; 定義了四個LED數(shù)據(jù),名字分別為led1~led4,這就是我們在leds目錄下看到這四個子目錄。它們所連接的引腳分別為B口的5~8,這是由S3C2410_GPB()宏定義完成的。標(biāo)識S3C24XX_LEDF_ACTLOW表示的是低電平有效,S3C24XX_LEDF_TRISTATE表示的三態(tài)無效。另外def_trigger表示的是觸發(fā)控制,如我們對nand進(jìn)行讀寫操作時,led2會不停的閃,在這里我們沒有用到這個功能,暫時不用理會。 static struct platform_device zhaocj2440_led1= { .name = 's3c24xx_led', .id = 1, .dev = { .platform_data = &zhaocj2440_led1_pdata, }, }; static struct platform_device zhaocj2440_led2= { .name = 's3c24xx_led', .id = 2, .dev = { .platform_data = &zhaocj2440_led2_pdata, }, }; static struct platform_device zhaocj2440_led3= { .name = 's3c24xx_led', .id = 3, .dev = { .platform_data = &zhaocj2440_led3_pdata, }, }; static struct platform_device zhaocj2440_led4= { .name = 's3c24xx_led', .id = 4, .dev = { .platform_data = &zhaocj2440_led4_pdata, }, }; 上面則創(chuàng)建了總線平臺設(shè)備,四個LED的設(shè)備名稱都是s3c24xx_led,子設(shè)備id分別從1到4,設(shè)備數(shù)據(jù)則是上面定義的四個LED數(shù)據(jù)。然后把這四個LED設(shè)備再添加到開發(fā)板的設(shè)備數(shù)組中,即: static struct platform_device *zhaocj2440_devices[]__initdata = { …… &zhaocj2440_led1, &zhaocj2440_led2, &zhaocj2440_led3, &zhaocj2440_led4, …… }; 最后,在開發(fā)板系統(tǒng)初始化過程中,再把設(shè)備數(shù)組中的設(shè)備逐一注冊到系統(tǒng)總線上,即: static void __init zhaocj2440_init(void) { …… platform_add_devices(zhaocj2440_devices,ARRAY_SIZE(zhaocj2440_devices)); …… } 這樣就完成了LED設(shè)備的創(chuàng)建。 光有設(shè)備還不能工作,任何一個設(shè)備的運行還需要與之相對應(yīng)的驅(qū)動。對于基于s3c24xx的LED來說,它的驅(qū)動是在drivers/leds目錄下Leds-s3c24xx.c文件內(nèi)創(chuàng)建的,即: static struct platform_driver s3c24xx_led_driver = { .probe = s3c24xx_led_probe, .remove = s3c24xx_led_remove, .driver = {
上一篇:LCD驅(qū)動移植在在mini2440(linux2.6.29)和FS4412(linux3.14.78)上實現(xiàn)對比(deep dive)
下一篇:Ubuntu 12.04嵌入式交叉編譯環(huán)境arm-linux-gcc搭建過程圖解
推薦閱讀最新更新時間:2025-04-05 14:36




設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 迅為IMX6開發(fā)板Android應(yīng)用-AndroidStudio-calculator測試
- 玩轉(zhuǎn) ESP32 + Arduino (二十) SIM800L上傳數(shù)據(jù)到OneNet(新版Mqtts)
- 玩轉(zhuǎn) ESP32 + Arduino (二十一) SPIFFS文件系統(tǒng) (已棄用)
- 玩轉(zhuǎn) ESP32 + Arduino (二十二) SIM800L上傳數(shù)據(jù)到阿里IOT(溫濕度和LBS)(NTP對時)
- 玩轉(zhuǎn) ESP32 + Arduino (二十三) 多文件系統(tǒng)及全局變量
- 玩轉(zhuǎn) ESP32 + Arduino (二十四) SD卡讀寫
- 玩轉(zhuǎn) ESP32 + Arduino (二十五) SSD1306庫驅(qū)動OLED
- 玩轉(zhuǎn) ESP32 + Arduino(二十六) 按鍵控制庫 OneButton
- 玩轉(zhuǎn) ESP32 + Arduino(二十七) ESP對象
- LT6654BHS6-4.096 八路 DAC 電壓基準(zhǔn)的典型應(yīng)用
- LT1634ACS8-4.096 單節(jié)鋰離子電池監(jiān)控電路的典型應(yīng)用 (IQ = 20uA)
- 征集令 |自動澆花器
- 仿小米臺燈的觸摸無級可調(diào)亮度可充電臺燈
- 使用 Analog Devices 的 RREF02 的參考設(shè)計
- 一個簡單的表面貼裝閃存 Vpp 發(fā)生器
- LTC1742CFW 演示板,14 位/65 Msps 低噪聲 ADC,Ain > 40MHz
- 使用 Analog Devices 的 ADM8840 的參考設(shè)計
- LT6656BIS6-3.3、3.3V 微控制器電壓基準(zhǔn)和穩(wěn)壓器的典型應(yīng)用
- 【涂鴉智能】涂鴉三明治-LGT328P智能開窗器
- 從實驗室到工業(yè)場景:優(yōu)艾智合密集發(fā)布7款人形機器人
- 地表最酷人形機器人,拿下新一輪2億元融資
- 自動駕駛警示:沒有企業(yè)能完全避免自動駕駛在復(fù)雜環(huán)境中的失誤
- 高階就高級嗎?我們到底該如何使用智能駕駛輔助?
- 即將迎來第三代?嵐圖固態(tài)電池研發(fā)進(jìn)展曝光
- 一文了解2025年3月的固態(tài)電池大事件!
- 傳統(tǒng)鋰電、半固態(tài)、固態(tài)電池終極對決:誰將主宰新能源未來?
- 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,背后AI含量差幾何?
- 左手AI,右手機器人,半導(dǎo)體巨頭英飛凌的新故事
- 激光雷達(dá)的復(fù)仇
- 特朗普稱擬再對華1000億美元商品征稅 外交部回應(yīng)
- 日美半導(dǎo)體協(xié)議會對二手設(shè)備市場產(chǎn)生實質(zhì)性影響嗎?
- 蘋果:模塊化 Mac Pro 將在 2019 年發(fā)售
- 時識科技可望第三季度完成全球首款類腦芯片商業(yè)化落地
- 任正非否認(rèn)華為是自己說了算 稱公司大企業(yè)病很嚴(yán)重
- 5G基站將給供應(yīng)鏈帶來新的春天
- 大屏幕需求不斷,折疊手機將成新寵
- 更省空間,更低功耗—TT Electronics 微型低剖面功率電感器
- 物聯(lián)網(wǎng),UEM,RCS,LBS和5G將在2019年塑造科技競爭生態(tài)
- 誰會在5G領(lǐng)域大賺一番?高通or英特爾還是...