嵌入式Linux驅動筆記(九)------dts裝置樹在2440使用

風箏丶發表於2017-08-24

你好!這裡是風箏的部落格,

歡迎和我一起多多交流。

ARM社群一貫充斥的大量垃圾程式碼導致Linus盛怒,因此社群在2011年到2012年進行了大量的工作。ARM Linux開始圍繞Device Tree展開,Device Tree有自己的獨立的語法,它的原始檔為.dts,編譯後得到.dtb,Bootloader在引導Linux核心的時候會將.dtb地址告知核心。之後核心會展開Device Tree並建立和註冊相關的裝置。因此arch/arm/mach-xxx和arch/arm/plat-xxx中大量的用於註冊platform、I2C、SPI板級資訊的程式碼被刪除,而驅動也以新的方式和.dts中定義的裝置結點進行匹配。

Device Tree是一種描述硬體的資料結構,它起源於 OpenFirmware (OF)。所以看到帶有OF 字樣的API函式就要小心了。

這裡 ,我們先看kernel部分
在arch/arm/boot/dts裡面,發現並沒有關於2440的裝置樹檔案,但是發現2416採用了裝置樹。其中,有dts檔案和dtsi檔案,先說下這兩者關係:
.dts檔案是一種ASCII文字格式的DeviceTree描述。基本上,在ARMLinux內,一個.dts檔案對應一個ARM的machine,一般放置在核心的arch/arm/boot/dts/目錄。由於一個SoC可能對應多個machine(一個SoC可以對應多個產品和電路板),勢必這些.dts檔案需包含許多共同的部分。Linux核心為了簡化,把SoC公用的部分或者多個machine共同的部分一般提煉為.dtsi,類似於C語言的標頭檔案。其他的machine對應的.dts就include這個.dtsi。
所以,我們編寫2440的dts檔案時可以參考s3c2416-smdk2416.dts這個檔案:
cp s3c2416-smdk2416.dts s3c2440.dts
vi Makefile
找到如下:
dtb-$(CONFIG_ARCH_S3C24XX) += \
s3c2416-smdk2416.dtb

修改為:
dtb-$(CONFIG_ARCH_S3C24XX) += \
s3c2440.dtb

接著在核心頂層目錄裡:
make menuconfig
選上 Boot options —> Flattened Device Tree support
最後 make dtbs即可編譯裝置樹(因為arch/arm/configs/s3c2410_defconfig檔案裡CONFIG_ARCH_S3C24XX=y,所以會編譯出s3c2440.dtb檔案)。

接著,是uboot部分
在uboot裡,如果使用裝置樹進行傳遞引數,為了使能Device Tree,則需要在相應的標頭檔案中巨集定義,
即u-boot-2016.11/include/configs/smdk2440.h檔案新增:
#define CONFIG_OF_LIBFDT
為什麼定義這個呢?
因為在fdt_support.h裡,有一句:

#ifdef CONFIG_OF_LIBFDT
/*各種外部函式宣告*/
#endif

說的是隻有定義了CONFIG_OF_LIBFDT,才能使用關於裝置樹這些的函式。

現在遇到了點問題:http://www.100ask.org/bbs/forum.php?mod=viewthread&tid=18925&extra=

先碼住,還沒成功,,,,,,
待續

相關文章