国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux學(xué)習(xí)第30天:Linux 自帶的 LED 燈驅(qū)動(dòng)實(shí)驗(yàn):驅(qū)動(dòng)開(kāi)發(fā)思維方式的轉(zhuǎn)變勢(shì)在必行

這篇具有很好參考價(jià)值的文章主要介紹了Linux學(xué)習(xí)第30天:Linux 自帶的 LED 燈驅(qū)動(dòng)實(shí)驗(yàn):驅(qū)動(dòng)開(kāi)發(fā)思維方式的轉(zhuǎn)變勢(shì)在必行。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Linux版本號(hào)4.1.15? ?芯片I.MX6ULL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ??大叔學(xué)Linux? ? 品人間百味? 思文短情長(zhǎng)?


? ? ? ? ?學(xué)習(xí)嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)整整30天了。今天簡(jiǎn)單做一個(gè)小結(jié)。因?yàn)橹暗闹饕ぷ魇亲鯝RM的裸機(jī)開(kāi)發(fā),所以接觸Linux以后感覺(jué)很多東西都變了。不僅僅包括相關(guān)知識(shí)點(diǎn)的歸納,更重要的是思維方式的轉(zhuǎn)變。做裸機(jī)開(kāi)發(fā)的時(shí)候,在很多時(shí)候是要弄清楚最底層的邏輯才能進(jìn)行代碼的開(kāi)發(fā)。而Linux則更像是站在一個(gè)更高的維度去思考,很細(xì)枝末葉的東西是不需要考慮的。相對(duì)裸機(jī)開(kāi)發(fā)的維度來(lái)說(shuō),裸機(jī)開(kāi)發(fā)后做Linux驅(qū)動(dòng)開(kāi)發(fā)更有點(diǎn)降維打擊的感覺(jué)。但并不是說(shuō)Linux驅(qū)動(dòng)開(kāi)發(fā)簡(jiǎn)單,而是說(shuō)裸機(jī)開(kāi)發(fā)對(duì)底層的要求可能會(huì)更高一些。以上僅僅是個(gè)人的一點(diǎn)自我感受。

????????本節(jié)筆記主要學(xué)習(xí)Linux自帶的LED驅(qū)動(dòng)試驗(yàn)。主要內(nèi)容包括驅(qū)動(dòng)使能、簡(jiǎn)介、設(shè)備樹(shù)節(jié)點(diǎn)編寫(xiě)及運(yùn)行測(cè)試。其中驅(qū)動(dòng)簡(jiǎn)介又包括LED燈驅(qū)動(dòng)框架分析、module_platform_driver函數(shù)簡(jiǎn)介和gpio_led_probe函數(shù)簡(jiǎn)析。

Linux學(xué)習(xí)第30天:Linux 自帶的 LED 燈驅(qū)動(dòng)實(shí)驗(yàn):驅(qū)動(dòng)開(kāi)發(fā)思維方式的轉(zhuǎn)變勢(shì)在必行,嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)學(xué)習(xí),學(xué)習(xí),linux,arm開(kāi)發(fā),嵌入式硬件,arm

一、Linux內(nèi)核自帶的LED燈驅(qū)動(dòng)使能

? ? ? ? 需要配置Linux內(nèi)核,使能自帶的LED驅(qū)動(dòng)。使用make menuconfig打開(kāi)Linux配置菜單。

? ? ? ? 按照如下路徑打開(kāi)LED驅(qū)動(dòng)配置項(xiàng):

? ? ? ? Device Drivers

? ? ? ? ? ? ? ? LED Support(NEW_LEDS=[y])

? ? ? ? ? ? ? ? ? ? ? ? LED Support for GPIO connected LEDs.?在此選項(xiàng)上按下“ Y”鍵,使此選項(xiàng)前面變?yōu)椤?<*>”,

????????重新編譯 Linux 內(nèi)核,然后使用新編譯出來(lái)的 zImage 鏡像啟動(dòng)開(kāi)發(fā)板。

二、Linux內(nèi)核自帶LED驅(qū)動(dòng)簡(jiǎn)介

1、LED燈驅(qū)動(dòng)框架分析

obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o

236 static const struct of_device_id of_gpio_leds_match[] = {
237 { .compatible = "gpio-leds", },
238 {},
239 };

????????LED 驅(qū)動(dòng)的匹配表,此表只有一個(gè)匹配項(xiàng), compatible 內(nèi)容為“ gpio-leds”,因此設(shè)備樹(shù)中的 LED 燈設(shè)備節(jié)點(diǎn)的 compatible 屬性值也要為“ gpio-leds”,否則設(shè)備和驅(qū)動(dòng)匹配不成功,驅(qū)動(dòng)就沒(méi)法工作。

static struct platform_driver gpio_led_driver = {
291 .probe = gpio_led_probe,
292 .remove = gpio_led_remove,
293 .driver = {
294 .name = "leds-gpio",
295 .of_match_table = of_gpio_leds_match,
296 },

????????platform_driver 驅(qū)動(dòng)結(jié)構(gòu)體變量,可以看出, Linux 內(nèi)核自帶的 LED 驅(qū)動(dòng)采用了 platform 框架。

module_platform_driver(gpio_led_driver);

????????通過(guò) module_platform_driver 函數(shù)向 Linux 內(nèi)核注冊(cè) gpio_led_driver 這個(gè) platform
驅(qū)動(dòng)。

2、module_platform_driver函數(shù)簡(jiǎn)介

????????module_platform_driver 定義在 include/linux/platform_device.h 文件中為一個(gè),

????????module_platform_driver 依賴(lài) module_driver, module_driver 也是一個(gè)宏。

????????module_platform_driver 函數(shù)的功能就是完成 platform 驅(qū)動(dòng)的注冊(cè)和刪除。

3、gpio_led_probe函數(shù)簡(jiǎn)析

269 priv = gpio_leds_create(pdev);
270 if (IS_ERR(priv))
271 return PTR_ERR(priv);

????????如果使用設(shè)備樹(shù)的話,使用 gpio_leds_create 函數(shù)從設(shè)備樹(shù)中提取設(shè)備信息,獲取到的 LED 燈 GPIO 信息保存在返回值中。

? ? ? ? 在gpio_leds_create 函數(shù)中,調(diào)用 device_get_child_node_count 函數(shù)統(tǒng)計(jì)子節(jié)點(diǎn)數(shù)量,一般在在設(shè)備樹(shù)中創(chuàng)建一個(gè)節(jié)點(diǎn)表示 LED 燈,然后在這個(gè)節(jié)點(diǎn)下面為每個(gè) LED 燈創(chuàng)建一個(gè)子節(jié)點(diǎn)。因此子節(jié)點(diǎn)數(shù)量也是 LED 燈的數(shù)量。
?

device_for_each_child_node(dev, child) {

????????遍歷每個(gè)子節(jié)點(diǎn),獲取每個(gè)子節(jié)點(diǎn)的信息。

led.gpiod = devm_get_gpiod_from_child(dev, NULL, child);

????????獲取 LED 燈所使用的 GPIO 信息。

196 if (fwnode_property_present(child, "label")) {
197 fwnode_property_read_string(child, "label", &led.name);

????????讀取子節(jié)點(diǎn) label 屬性值,因?yàn)槭褂?label 屬性作為 LED 的名字。

204 fwnode_property_read_string(child, "linux,default-trigger",
205 &led.default_trigger);

????????獲取“ linux,default-trigger”屬性值,可以通過(guò)此屬性設(shè)置某個(gè) LED 燈在Linux 系統(tǒng)中的默認(rèn)功能,比如作為系統(tǒng)心跳指示燈等等。

207 if (!fwnode_property_read_string(child, "default-state",
208 &state)) {
209 if (!strcmp(state, "keep"))
210 led.default_state = LEDS_GPIO_DEFSTATE_KEEP;
211 else if (!strcmp(state, "on"))
212 led.default_state = LEDS_GPIO_DEFSTATE_ON;
213 else
214 led.default_state = LEDS_GPIO_DEFSTATE_OFF;
215 }

????????獲取“ default-state”屬性值,也就是 LED 燈的默認(rèn)狀態(tài)屬性。

220 ret = create_gpio_led(&led, &priv->leds[priv->num_leds++],
221 dev, NULL);

????????調(diào)用 create_gpio_led 函數(shù)創(chuàng)建 LED 相關(guān)的 io,其實(shí)就是設(shè)置 LED 所使用的 io為輸出之類(lèi)的。 create_gpio_led 函數(shù)主要是初始化 led_dat 這個(gè) gpio_led_data 結(jié)構(gòu)體類(lèi)型變量,led_dat 保存了 LED 的操作函數(shù)等內(nèi)容。

????????gpio_led_probe 函數(shù)主要功能就是獲取 LED 燈的設(shè)備信息,然后根據(jù)這些信息來(lái)初始化對(duì)應(yīng)的 IO,設(shè)置為輸出等。? ? ?

三、設(shè)備樹(shù)節(jié)點(diǎn)編寫(xiě)

????????在編寫(xiě)設(shè)備節(jié)點(diǎn)的時(shí)候要注意以下幾點(diǎn):
①、創(chuàng)建一個(gè)節(jié)點(diǎn)表示 LED 燈設(shè)備,比如 dtsleds,如果板子上有多個(gè) LED 燈的話每個(gè) LED
燈都作為 dtsleds 的子節(jié)點(diǎn)。
②、 dtsleds 節(jié)點(diǎn)的 compatible 屬性值一定要為“ gpio-leds”。
③、設(shè)置 label 屬性,此屬性為可選,每個(gè)子節(jié)點(diǎn)都有一個(gè) label 屬性, label 屬性一般表示
LED 燈的名字,比如以顏色區(qū)分的話就是 red、 green 等等。
④、每個(gè)子節(jié)點(diǎn)必須要設(shè)置 gpios 屬性值,表示此 LED 所使用的 GPIO 引腳!
⑤、可以設(shè)置“ linux,default-trigger”屬性值,也就是設(shè)置 LED 燈的默認(rèn)功能,比如:
backlight: LED 燈作為背光。
default-on: LED 燈打開(kāi)
heartbeat: LED 燈作為心跳指示燈,可以作為系統(tǒng)運(yùn)行提示燈。
ide-disk: LED 燈作為硬盤(pán)活動(dòng)指示燈。
timer: LED 燈周期性閃爍,由定時(shí)器驅(qū)動(dòng),閃爍頻率可以修改
⑥、可以設(shè)置“ default-state”屬性值,可以設(shè)置為 on、 off 或 keep,為 on 的時(shí)候 LED 燈默
認(rèn)打開(kāi),為 off 的話 LED 燈默認(rèn)關(guān)閉,為 keep 的話 LED 燈保持當(dāng)前模式。

1 dtsleds {
2 compatible = "gpio-leds";
3 4
led0 {
5 label = "red";
6 gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
7 default-state = "off";
8 };
9 };

四、運(yùn)行測(cè)試

????????啟 動(dòng) 開(kāi) 發(fā) 板 , 啟 動(dòng) 以 后 查 看/sys/bus/platform/devices/dtsleds 這個(gè)目錄是否存在。

進(jìn)入到 leds 目錄中,此目錄中的內(nèi)容如圖所示:

Linux學(xué)習(xí)第30天:Linux 自帶的 LED 燈驅(qū)動(dòng)實(shí)驗(yàn):驅(qū)動(dòng)開(kāi)發(fā)思維方式的轉(zhuǎn)變勢(shì)在必行,嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)學(xué)習(xí),學(xué)習(xí),linux,arm開(kāi)發(fā),嵌入式硬件,arm

????????在 leds 目錄下有一個(gè)名為“ red”子目錄,這個(gè)子目錄的名字就是我們?cè)谠O(shè)備樹(shù)中第 5 行設(shè)置的 label 屬性值。

????????輸入如下命令打開(kāi) RED 這個(gè) LED 燈:
echo 1 > /sys/class/leds/red/brightness //打開(kāi) LED0
????????關(guān)閉 RED 這個(gè) LED 燈的命令如下:
echo 0 > /sys/class/leds/red/brightness //關(guān)閉 LED0

????????系統(tǒng)運(yùn)行指示燈:

1 dtsleds {
2 compatible = "gpio-leds";
3 4
led0 {
5 label = "red";
6 gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
7 linux,default-trigger = "heartbeat";
8 default-state = "on";
9 };
10 };

????????設(shè)置 LED0 作為系統(tǒng)指示燈,在 dtsleds 這個(gè)設(shè)備節(jié)點(diǎn)中加入“ linux,default-trigger”屬性信息即可,屬性值為“ heartbeat”。

五、總結(jié)

????????本節(jié)筆記主要內(nèi)容包括驅(qū)動(dòng)使能、簡(jiǎn)介、設(shè)備樹(shù)節(jié)點(diǎn)編寫(xiě)及運(yùn)行測(cè)試。其中驅(qū)動(dòng)簡(jiǎn)介又包括LED燈驅(qū)動(dòng)框架分析、module_platform_driver函數(shù)簡(jiǎn)介和gpio_led_probe函數(shù)簡(jiǎn)析。


本文為參考正點(diǎn)原子開(kāi)發(fā)板配套教程整理而得,僅用于學(xué)習(xí)交流使用,不得用于商業(yè)用途。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-743720.html

到了這里,關(guān)于Linux學(xué)習(xí)第30天:Linux 自帶的 LED 燈驅(qū)動(dòng)實(shí)驗(yàn):驅(qū)動(dòng)開(kāi)發(fā)思維方式的轉(zhuǎn)變勢(shì)在必行的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Linux 驅(qū)動(dòng)開(kāi)發(fā)基礎(chǔ)知識(shí)——認(rèn)識(shí)LED驅(qū)動(dòng)程序 (二)

    Linux 驅(qū)動(dòng)開(kāi)發(fā)基礎(chǔ)知識(shí)——認(rèn)識(shí)LED驅(qū)動(dòng)程序 (二)

    ?個(gè)人名片: ??作者簡(jiǎn)介:一名喜歡分享和記錄學(xué)習(xí)的在校大學(xué)生 ??個(gè)人主頁(yè):妄北y ??個(gè)人QQ:2061314755 ??個(gè)人郵箱:2061314755@qq.com ??個(gè)人WeChat:Vir2021GKBS ?? 本文由妄北y原創(chuàng),首發(fā)CSDN ?????? ??座右銘:大多數(shù)人想要改造這個(gè)世界,但卻罕有人想改造自己。 專(zhuān)欄導(dǎo)

    2024年01月21日
    瀏覽(23)
  • [Linux_IMX6ULL驅(qū)動(dòng)開(kāi)發(fā)]-LED驅(qū)動(dòng)

    [Linux_IMX6ULL驅(qū)動(dòng)開(kāi)發(fā)]-LED驅(qū)動(dòng)

    其實(shí)在本人的理解看來(lái),在驅(qū)動(dòng)上面操控LED,和使用STM32在操控LED是大同小異的,因?yàn)楸举|(zhì)都是控制引腳的輸出電平,來(lái)達(dá)到點(diǎn)亮或者熄滅LED的作用,在這里,我們想要操控LED,我們首先要先清除它的原理圖是什么樣的。 如上圖所示可知,想要點(diǎn)亮LED,那么我們需要控制引腳

    2024年04月14日
    瀏覽(19)
  • QEMU學(xué)習(xí)(二):LED設(shè)備仿真及驅(qū)動(dòng)開(kāi)發(fā)

    QEMU學(xué)習(xí)(二):LED設(shè)備仿真及驅(qū)動(dòng)開(kāi)發(fā)

    在仿真led之前,先來(lái)了解一下QEMU源碼結(jié)構(gòu)及GPIO仿真原理。 QEMU源碼目錄 我們只羅列出涉及的少許文件,由此可以看出,我們要仿真的設(shè)備文件都放在hw目錄下,一般來(lái)說(shuō)一個(gè).c 文件會(huì)有一個(gè).h 文件,它們的目錄類(lèi)似。 比如 hw/gpio/imx_gpio.c 對(duì)應(yīng)的頭文件為 include/hw/gpio/imx_gpio.

    2024年02月09日
    瀏覽(22)
  • Linux 驅(qū)動(dòng)開(kāi)發(fā)基礎(chǔ)知識(shí)——LED 模板驅(qū)動(dòng)程序的改造:設(shè)備樹(shù)(十一)

    Linux 驅(qū)動(dòng)開(kāi)發(fā)基礎(chǔ)知識(shí)——LED 模板驅(qū)動(dòng)程序的改造:設(shè)備樹(shù)(十一)

    ?個(gè)人名片: ??作者簡(jiǎn)介:學(xué)生 ??個(gè)人主頁(yè):妄北y ??個(gè)人QQ:2061314755 ??個(gè)人郵箱:2061314755@qq.com ??個(gè)人WeChat:Vir2021GKBS ?? 本文由妄北y原創(chuàng),首發(fā)CSDN ?????? ??座右銘:大多數(shù)人想要改造這個(gè)世界,但卻罕有人想改造自己。 專(zhuān)欄導(dǎo)航: 妄北y系列專(zhuān)欄導(dǎo)航: C/C++的基

    2024年02月21日
    瀏覽(14)
  • 嵌入式Linux裸機(jī)開(kāi)發(fā)(一)基礎(chǔ)介紹及匯編LED驅(qū)動(dòng)

    嵌入式Linux裸機(jī)開(kāi)發(fā)(一)基礎(chǔ)介紹及匯編LED驅(qū)動(dòng)

    現(xiàn)在開(kāi)始正式在開(kāi)發(fā)板上進(jìn)行開(kāi)發(fā),仍然看的是正點(diǎn)原子的資料 使用的是Cortex-A7 點(diǎn)擊芯片名字打開(kāi)介紹,主要參考的手冊(cè)是: 以及數(shù)據(jù)手冊(cè): 對(duì)于一般的STM32來(lái)說(shuō),IO的表現(xiàn)形式為: 管教名為PA1,管腳的功能在倒數(shù)第二列 對(duì)于IMX6ULL,IO形式在參考手冊(cè)里面,且沒(méi)有上面的表

    2024年02月07日
    瀏覽(86)
  • 【LED子系統(tǒng)深度剖析】一、開(kāi)篇詞|Linux驅(qū)動(dòng)開(kāi)發(fā)必讀

    我的圈子: 高級(jí)工程師聚集地 我是董哥,高級(jí)嵌入式軟件開(kāi)發(fā)工程師,從事嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)和系統(tǒng)開(kāi)發(fā),曾就職于世界500強(qiáng)公司! 創(chuàng)作理念:專(zhuān)注分享高質(zhì)量嵌入式文章,讓大家讀有所得!

    2024年02月09日
    瀏覽(19)
  • FPGA在校學(xué)習(xí)記錄系列---實(shí)驗(yàn)4不同狀態(tài)的LED+開(kāi)發(fā)板(Verilog HDL)

    FPGA在校學(xué)習(xí)記錄系列---實(shí)驗(yàn)4不同狀態(tài)的LED+開(kāi)發(fā)板(Verilog HDL)

    此系列記錄FPGA在學(xué)校的學(xué)習(xí)過(guò)程。 FPGA系列 需要用到的軟硬件: 軟件:Quartus II 15.0 (64-bit) 硬件: 5CEBA4F23C7芯片 鏈接: FPGA在校學(xué)習(xí)記錄系列—新建一個(gè)FPGA工程編寫(xiě)程序并仿真(Verilog HDL) 創(chuàng)建的工程名字為:LED (這次不用仿真,直接用開(kāi)發(fā)板驗(yàn)證) 編譯文件 按鍵資源:

    2024年04月09日
    瀏覽(28)
  • 驅(qū)動(dòng)——按鍵中斷控制LED燈實(shí)驗(yàn)

    要求:按鍵按一下燈亮,再按一下燈滅 注:由于開(kāi)發(fā)板位置,為了方便一一對(duì)應(yīng)觀察,采用key1控制LED3,key2控制LED2,key3控制LED1 0、添加相關(guān)設(shè)備樹(shù)節(jié)點(diǎn)信息 ①按鍵相關(guān)引腳,通過(guò)原理圖可得: key1------gpiof9; key2------gpiof7; key3------gpiof8 ②LED燈相關(guān)引腳: led1-----gpioe10; led2---

    2023年04月18日
    瀏覽(27)
  • LED燈閃爍拓展實(shí)驗(yàn)——單按鍵控制LED燈不同閃爍方式

    LED燈閃爍拓展實(shí)驗(yàn)——單按鍵控制LED燈不同閃爍方式

    實(shí)現(xiàn)平臺(tái):Vivado2018.3 1. 使用按鍵KEY0和KEY_1分別控制LED0和LED1兩個(gè)LED燈的閃爍方式; 2. 當(dāng)沒(méi)有按鍵按下時(shí),兩個(gè)LED燈均不亮; 3. 當(dāng)按鍵KEY0按下后,LED0燈閃爍,當(dāng)按鍵KEY0再次按下后則LED1燈閃爍,如此循環(huán)往復(fù); 4. 當(dāng)按鍵KEY1按下后,LED0和LED1交替閃爍,當(dāng)按鍵KEY1再次按下后則

    2024年01月23日
    瀏覽(17)
  • Linux學(xué)習(xí)第31天:Linux MISC 驅(qū)動(dòng)實(shí)驗(yàn):溫故知新

    Linux學(xué)習(xí)第31天:Linux MISC 驅(qū)動(dòng)實(shí)驗(yàn):溫故知新

    Linux版本號(hào)4.1.15? ?芯片I.MX6ULL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ?? 大叔學(xué)Linux? ? 品人間百味? 思文短情長(zhǎng) ? ? ? ? ? 學(xué)習(xí)是一個(gè)不斷重復(fù)的過(guò)程。只有不斷的使用、修正,才能越記越牢。將學(xué)習(xí)到的新的知識(shí)點(diǎn)應(yīng)用到以往的項(xiàng)目經(jīng)驗(yàn)中,才能不斷提升自我,長(zhǎng)此以往

    2024年02月06日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包