《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 業(yè)界動態(tài) > 設(shè)備樹使用簡介

設(shè)備樹使用簡介

2019-10-31
來源:致遠電子
關(guān)鍵詞: FDT 設(shè)備樹 Linux

  摘要:是不是所有的Linux內(nèi)核都是完美的?畢竟諸多黑客效力于此,當然不是,至少在內(nèi)核3.x版本之前不是,之前的代碼臃腫,代碼利用率較低,直到設(shè)備樹的引入,徹底改善這一情況;

  一、FDT的概念

  系統(tǒng)啟動時,Bootloader開始加載,將內(nèi)核文件,如zImage讀取到內(nèi)存中,內(nèi)核按照我們的代碼,逐一去配置每個寄存器,每個外設(shè),似乎沒有什么問題。但是試想一下,100種ARM芯片,就要寫100個配置文件么?當然,如果你非要這么做,我也無話可說。如果能抽象出一種數(shù)據(jù)結(jié)構(gòu),它可以直接抽象出內(nèi)核需要配置的所有硬件以及硬件屬性,BootLoader預(yù)讀取到內(nèi)存中,在內(nèi)核啟動以后,可以直接配置,對于用戶而言,配置MCU的外圍時我們直接面對的就只是這個DTS文件,極其方便快捷。FDT準確來講是一種數(shù)據(jù)結(jié)構(gòu),使得硬件可以用形如XML的描述語言來描述。

  二、設(shè)備樹結(jié)構(gòu)

設(shè)備樹使用簡介388.png

  圖一 設(shè)備樹結(jié)構(gòu)

  設(shè)備樹一般包含以上內(nèi)容:

  根節(jié)點“/”下的model ,這個一般為字符串類型,它描述了廠商以及板子名稱;

  根節(jié)點“/”下的compitable,這個一般為字符串類型,用以匹配model選定的開發(fā)板對應(yīng)的代碼;包括后續(xù)外圍驅(qū)動的匹配均是有這個compitable來完成;

  根節(jié)點“/”下的aliases,這個設(shè)備節(jié)點只能放在根節(jié)點目錄,主要用以存放外設(shè)的別名,簡單講,"/soc/aips-bus@02000000/spba-bus@02000000/serial@02020000"其實是一個串口,但是開發(fā)人員自己看起來并不直觀,我可以在aliases中寫作:serial ="/soc/aips-bus@02000000/spba-bus@02000000/serial@02020000";serial即可代替剛才的串口設(shè)備;

  根節(jié)點“/”下的chosen:這個并非物理設(shè)備節(jié)點,而是內(nèi)核啟動參數(shù)的節(jié)點,類似于uboot階段的bootargs參數(shù);

  當然,這個節(jié)點也可以是子節(jié)點,不一定要在根節(jié)點下;

  實例:chosen {

  stdout-path = &uart1;

  };

  ?snvs@020b0000:除以上節(jié)點,剩下的我一般稱之為物理設(shè)備節(jié)點(可能不準確),以snvs外設(shè)舉例,直接舉例;

  實例:snvs@020b0000{

  conpitable = “fsl,imx6ul-snvs”;

  reg = <0x020b0000 0x4000>;

  interrupts = <0x0 0x4 0x4>;

  };

  (1)“@”后面緊跟就是該外設(shè)在MCU總線的地址,這個不難理解,可以理解為外設(shè)的基地址,外設(shè)模型 name@addresss;”

  (2)“compitable”:如上陳述,非常關(guān)鍵的屬性,匹配外設(shè)驅(qū)動,屬性模型 compitable = “[manufacture,[model]]”;

  (3)“reg”:該屬性為外設(shè)地址屬性,第一個參數(shù)為該節(jié)點總線地址,后者為地址長度;

  (4)“interrupt”:顧名思義,該外設(shè)的中斷,para1表示該中斷是不是SPI中斷(shared peripheral interrupt),注意名詞區(qū)分,參數(shù)值為1表示為SPI中斷,反之不是SPI中斷;para2是該中斷號;para3表示觸發(fā)方式,參數(shù)值為1,表示上升沿觸發(fā),為4表示高電平觸發(fā);如果需要低電平以及下降沿觸發(fā),硬件需要加非門;

  三、編譯設(shè)備樹與反編譯

  設(shè)備樹編譯,我們都知道使用如下命令編譯:

  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-  dtbs  或者

  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-  all

  實際上,是dtc這個文件在負責把dts解釋成dtb文件,該文件在內(nèi)核源碼根目錄 ./scripts/dtc

  編譯命令:

  ./scripts/dtc/dtc –I dts –O dtb /home/gyh/tmp/imx6y2c-256m.dtb  ./arch/arm/boot/dts/imx6y2c-256m.dts

  反編譯命令:

  ./scripts/dtc/dtc -I dtb -O dts -o /home/gyh/tmp/imx6y2c_asm.dts   ./arch/arm/boot/dts/imx6y2c-256m.dtb

  對于Linux命令的使用,可以使用help cmdname 或者man cmdname,對于dtc,非內(nèi)建命令,man dtc:

  -I <input format>

  Input formats are:

  dts - device tree source text

  dtb - device tree blob

  fs - /proc/device-tree style directory

  -O <output format>

  Output formats are:

  dts - device tree source text

  dtb - device tree blob

  asm - assembler source

  系統(tǒng)提供的dts一般引用dtsi這個母設(shè)備樹,所以大量外設(shè)都是直接引用dtsi中的,因此很難理解這些字符串是怎樣的匹配驅(qū)動程序的,但是一旦將已經(jīng)生產(chǎn)的dtb文件反編譯,生產(chǎn)的dts文件將更直觀;但是易讀性也更差。這并不矛盾;我選擇,” /”  ,”chosen” ,”aliases”三個節(jié)點來對比。

設(shè)備樹使用簡介2425.png

  圖二 BSP提供的dts文件

設(shè)備樹使用簡介2442.png 

圖三 反編譯的dts文件

  對同一個chosen節(jié)點:BSP中dts描述為stdout-path = &uart1;這樣很難想象它是怎樣把該外設(shè)定義為標準輸出的,但是如果看反編譯文件可以較好的理解,標準輸出被重定向到某個可以作為輸出的外設(shè)地址;

  四、設(shè)備樹節(jié)點添加與驗證

  (1)直接在dts文件中查找,是否已經(jīng)存在你需要的外設(shè)節(jié)點;如果有,且該外設(shè)支持多從機或者多節(jié)點,直接在該節(jié)點下面,添加子節(jié)點,以GPIO_LED為例。

設(shè)備樹使用簡介2657.png

  圖四 GPIO_LEDS節(jié)點

  (2)假設(shè),你需要添加一個黃色的LED,那么仿照已經(jīng)存在的節(jié)點,復制一個節(jié)點在母節(jié)點下,命名為green-led,同時用GPIO3_4為該LED驅(qū)動引腳;你希望在arm板上叫他,My_Cute(這個名字不好),那么最后修改如下:

設(shè)備樹使用簡介2789.png

  圖五 增加yellow-led節(jié)點

  (3)節(jié)點添加完成,引用了GPIO3_4,所以你需要確認該MCU引腳已經(jīng)配置為GPIO功能,這里直接貼出配置代碼:MX6UL_PAD_LCD_RESET__GPIO3_IO04 0x40017059

設(shè)備樹使用簡介2909.png

  圖六 引腳配置為GPIO

  該宏定義MX6UL_PAD_LCD_RESET__GPIO3_IO04在./arch/arm/boot/dts/imx6ull-pinfunc.h中;針對同一個引腳的全部復用,均定義了宏,可以直接調(diào)用;該dts并未直接包含imx6ull-pinfunc.h,在其他dtsi中已經(jīng)包含該頭文件;

  (4)如果之前已經(jīng)完全編譯過內(nèi)核,可以直接編譯dtb,注意不要make menuconfig或者defconfig,否則會覆蓋zImage的配置文件.config;

  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-  dtbs

  (5)編譯完成后,開發(fā)板直接進入uboot模式,tftp網(wǎng)絡(luò)燒寫dtb,reset重啟生效;

  run updtb

  (備注:updtb為組合命令updtb=if tftp ${fdt_file}; then nand erase.part dtb; nand write ${loadaddr} dtb ${filesize}; fi;)

  (6)如果dtb按照我們理解修改是正確的,那么我們將在開發(fā)板的/sys/class/leds下面看到我們的My_Cute這個LED節(jié)點;結(jié)果如下:

設(shè)備樹使用簡介3455.png

  圖七 開發(fā)板設(shè)備截圖

  其實,可以看到/sys/class/leds下面的設(shè)備節(jié)點都是指向/devices/platfome/leds目錄的連接文件,也就是這里僅僅是這個設(shè)備的“快捷方式”,我們也可以進行文件IO操作;

  (7)文件IO操作:打開My_Cute節(jié)點,可以看到以下接口可以操作,但是我們在添加GPIO_LEDS并沒有添加這些屬性。Brightness, trigger—led亮度以及觸發(fā)方式比較常用,那么問題來了,為什么會有這些接口。因為它們繼承了母節(jié)點的屬性,所以我們需要找到母節(jié)點設(shè)備的定義。

設(shè)備樹使用簡介3712.png

  圖八 yellow-led的操作接口

  (8)講道理,所有的內(nèi)核驅(qū)動你都可以嘗試在 ./driver/下面去找,針對led類,我們直接進入leds文件夾,發(fā)現(xiàn)leds的驅(qū)動leds-gpio.c在,在這里就可以理解led的接口為什么是這樣;當然優(yōu)秀的驅(qū)動應(yīng)該還有一份清晰的文檔,你同樣可也嘗試去源碼根目錄的. /Documentation 中查找leds-gpio的使用文檔;這里也會解釋,我為什么會去開發(fā)板的/sys/class/leds下面去查看我增加的My_Cute節(jié)點;

設(shè)備樹使用簡介3953.png

  圖九 驅(qū)動使用文檔

  (9)增加一個驅(qū)動或者一個設(shè)備節(jié)點到設(shè)備樹中,你可以先查看內(nèi)核源碼的/ Documentation目錄,其中包含了幾乎所有驅(qū)動的使用說明以及設(shè)備樹屬性的解釋,同時也包括大量優(yōu)秀的內(nèi)核調(diào)試技巧;再去寫節(jié)點,也可以先模仿,針對不懂的地方再來看文檔,印象更為深刻。

  五、結(jié)語

  設(shè)備樹相比于傳統(tǒng)的配置文件,無疑是降低了Linux外設(shè)開發(fā)與使用的門檻,但是也隱藏了大量的細節(jié),難以了解其底層的驅(qū)動原理;對于LINUX內(nèi)核的了解,我所認識的還不及冰山一角,單希望對你有一點幫助。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
91久久精品国产91久久性色| 久久精品成人一区二区三区| 国产精品视屏| 欧美激情久久久| 欧美xart系列在线观看| 久久久人成影片一区二区三区| 亚洲欧美在线看| 亚洲一区二区在线| 亚洲天天影视| 亚洲已满18点击进入久久| 中日韩视频在线观看| 一本色道**综合亚洲精品蜜桃冫 | 99国产精品视频免费观看| 亚洲精品社区| 亚洲最新中文字幕| 亚洲天堂av图片| 亚洲永久字幕| 午夜宅男久久久| 久久国产一区二区| 久久精品亚洲精品| 久久免费视频这里只有精品| 久久综合久久综合久久| 久久综合一区二区| 欧美激情第4页| 欧美日本在线观看| 欧美亚韩一区| 国产乱码精品一区二区三区av| 国产伦精品一区二区三区高清 | 夜夜爽www精品| 亚洲无线视频| 香蕉免费一区二区三区在线观看| 欧美一区激情视频在线观看| 亚洲国产精品久久久久秋霞不卡| 亚洲级视频在线观看免费1级| 亚洲老司机av| 亚洲影视综合| 久久久精品999| 欧美大片网址| 国产精品h在线观看| 国产欧美日韩综合精品二区| 韩日视频一区| 亚洲精品日日夜夜| 亚洲女女女同性video| 久久精品一区二区三区不卡牛牛 | 欧美亚洲专区| 久久综合图片| 欧美日韩精品免费| 国产日本欧美一区二区| 一区二区三区在线不卡| 亚洲欧洲精品一区二区三区不卡 | 午夜精品久久久久久99热| 久久国产视频网站| 欧美好吊妞视频| 国产精品久久久久久久久久久久| 国产一区二区毛片| 99riav1国产精品视频| 先锋亚洲精品| 一区二区三区四区精品| 久久精品国产免费| 欧美日韩国产在线观看| 国产午夜精品福利| 日韩一级视频免费观看在线| 久久国产福利| 亚洲欧美日韩国产| 蜜月aⅴ免费一区二区三区 | 亚洲欧美综合另类中字| 在线性视频日韩欧美| 久久精品99| 亚洲女人av| 欧美福利视频在线观看| 国产精品在线看| 亚洲精品视频在线观看网站| 欧美一区二区三区在线| 一本久道久久综合狠狠爱| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩免费观看一区二区三区| 国产一区二区中文| 一区二区三区黄色| 亚洲人成在线观看| 久久av老司机精品网站导航| 欧美日韩在线视频一区| 影音先锋在线一区| 亚洲欧美福利一区二区| 在线中文字幕一区| 美日韩免费视频| 国产欧美亚洲一区| 在线亚洲免费| 日韩视频一区二区在线观看| 久久理论片午夜琪琪电影网| 欧美午夜电影网| 最新国产精品拍自在线播放| 欧美一区激情| 欧美在线观看www| 国产精品成人aaaaa网站| 亚洲黑丝在线| 亚洲电影免费在线| 久久久精品网| 国产一区二区三区四区在线观看| 亚洲综合欧美日韩| 亚洲中字在线| 欧美日韩精品综合| 亚洲欧洲一区二区天堂久久| 亚洲高清自拍| 久久久久88色偷偷免费| 国产精品入口麻豆原神| 一区二区三区高清在线观看| 亚洲精品欧美日韩| 美女视频黄免费的久久| 国内自拍亚洲| 亚洲国产精品一区二区久| 久久久久久自在自线| 国产视频在线一区二区| 午夜欧美精品| 久久久久国产精品厨房| 国产中文一区| 亚洲第一精品电影| 久久一本综合频道| 一区二区在线观看视频| 亚洲高清视频的网址| 久久在线免费| 亚洲国产精品123| 亚洲精品永久免费| 欧美日本亚洲| 一本色道精品久久一区二区三区| 国产精品99久久久久久久女警| 欧美日本韩国在线| 一本大道久久a久久精品综合| 亚洲素人在线| 国产精品久久久免费| 亚洲一区二区欧美| 午夜日韩在线| 国产欧美婷婷中文| 久久国产精品久久久久久| 久久午夜电影网| 影音先锋久久| 99re成人精品视频| 欧美视频一区二| 亚洲在线国产日韩欧美| 久久大逼视频| 一区在线视频| 9i看片成人免费高清| 欧美视频免费在线| 亚洲欧美国产77777| 久久久久久69| 亚洲福利小视频| 亚洲图片激情小说| 国产精品视频一二三| 久久xxxx| 欧美精品在线网站| 一区二区三区偷拍| 久久精品国产欧美激情| 国内精品久久久久久| 亚洲麻豆视频| 国产精品嫩草影院av蜜臀| 欧美一区二区三区婷婷月色| 免费欧美在线视频| 亚洲美女av在线播放| 校园激情久久| 伊人狠狠色j香婷婷综合| 亚洲精品视频二区| 国产精品盗摄一区二区三区| 欧美一区二区大片| 欧美激情欧美狂野欧美精品| 亚洲午夜高清视频| 久久免费视频网| 亚洲人成人一区二区三区| 亚洲欧洲av一区二区三区久久| 国产午夜精品在线观看| 亚洲乱码国产乱码精品精天堂| 欧美网站在线| 亚洲国产成人av| 欧美日韩在线精品| 久久国产精品色婷婷| 欧美日韩一区二区免费在线观看| 亚洲欧美日产图| 欧美国内亚洲| 午夜在线精品偷拍| 欧美精品二区| 欧美在线视频一区| 欧美三级网址| 亚洲成色777777女色窝| 国产精品jvid在线观看蜜臀| 欧美制服丝袜第一页| 欧美日韩在线观看一区二区三区 | 亚洲一区二区综合| 欧美肥婆在线| 性欧美18~19sex高清播放| 欧美日韩国产黄| 久久精品国产一区二区三| 欧美午夜精品久久久久久人妖| 久久国内精品自在自线400部| 欧美日本国产一区| 亚洲高清影视| 蜜臀久久99精品久久久画质超高清| 一本色道久久综合狠狠躁篇怎么玩 | 欧美视频四区| 亚洲影院污污.| 欧美日韩国产精品成人| 亚洲第一天堂av| 国产女主播一区|