【全志平臺】dts內容如何最快導入到機器中
方法四:編譯kernel,pack,燒錄工具不選擇任何分區是最快的方法。
文章目錄
-
實驗目的:dts內容如何最快導入到機器中
-
關鍵字:dts
-
實驗平臺:全志T7-android
-
步驟:試驗各種已知方法,來導入dts到機器中
- 修改dts後編譯kernel 和 android 通過刷機軟件燒錄整包內容
- 修改dts後編譯kernel ,dd導入boot.img到boot分區
- 修改dts後pack, dd導入u-boot.fex到mmcblk0分區
步驟2/3,來確認dts會放在哪個分區。
-
試驗前準備:修改sun8iw17p1\configs\default\env.cfg文件:bootdelay=2以便能進入boot
-
試驗工具:Uboot FDT,通過此工具來判斷導入的內容是否奏效。
Uboot FDT用法:# 查看當前dts中所有內容項 fdt list /aliases #列出其中一項(nand0)中的內容 fdt list nand0
eg:
sunxi#fdt list /aliases
aliases {
serial0 = "/soc@01c00000/uart@01c28000";
..............
mmc0 = "/soc@01c00000/sdmmc@01c0f000";
mmc2 = "/soc@01c00000/sdmmc@01C11000";
nand0 = "/soc@01c00000/nand0@01c03000";
disp = "/soc@01c00000/disp@01000000";
lcd0 = "/soc@01c00000/lcd0@01c0c000";
hdmi = "/soc@01c00000/hdmi@01ee0000";
pwm = "/soc@01c00000/pwm@01c21400";
boot_disp = "/soc@01c00000/boot_disp";
};
sunxi#fdt list nand0
nand0@01c03000 {
compatible = "allwinner,sun50i-nand";
device_type = "nand0";
reg = <0x00000000 0x01c03000 0x00000000 0x00001000>;
..................
pinctrl-names = "default", "sleep";
pinctrl-1 = <0x00000081>;
};
注意:修改的文件是\lichee\linux-3.10\arch\arm\boot\dts\sun8iw17p1-carvout.dtsi
方法一:全編譯整包燒錄
- 修改sun8iw17p1-carvout.dtsi文件中uart1
uart1: uart@05000400 {
compatible = "allwinner,sun8i-uart";
device_type = "uart1";
reg = <0x0 0x05000400 0x0 0x400>;
interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk_uart1>;
cshang = <3>; /*增加cshang項*/
pinctrl-names = "cshang", "sleep";/*修改名字*/
pinctrl-0 = <&uart1_pins_a>;
pinctrl-1 = <&uart1_pins_b>;
uart1_port = <1>;
uart1_type = <4>;
use_dma = <1>;
status = "disabled";
};
- 測試結果:
sunxi#fdt list serial1
uart@05000400 {
compatible = "allwinner,sun8i-uart";
device_type = "uart1";
reg = <0x00000000 0x05000400 0x00000000 0x00000400>;
interrupts = <0x00000000 0x0000003d 0x00000004>;
clocks = <0x00000022>;
cshang = <0x00000003>;
pinctrl-names = "cshang", "sleep";
uart1_port = <0x00000001>;
uart1_type = <0x00000002>;
use_dma = <0x00000001>;
status = "disabled";
pinctrl-0 = <0x00000122>;
pinctrl-1 = <0x00000123>;
};
- 結論:全編譯整包燒錄方法試驗成功,可以把修改的dts內容導入到機器中。
方法二:編譯kernel ,dd導入boot.img
注意:pack不會影響kernel下的boot.img
- 修改內容:
uart1: uart@05000400 {
compatible = "allwinner,sun8i-uart";
device_type = "uart1";
reg = <0x0 0x05000400 0x0 0x400>;
interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk_uart1>;
cshang = <4>;/*數值改爲4*/
pinctrl-names = "cshang4", "sleep";/*名字改爲cshang4*/
pinctrl-0 = <&uart1_pins_a>;
pinctrl-1 = <&uart1_pins_b>;
uart1_port = <1>;
uart1_type = <4>;
use_dma = <1>;
status = "disabled";
};
- 測試流程:
- 編譯kernel
- 把編譯出來的boot.img導入到boot分區
E:\cmder_mini
λ adb spush Z:\t7\android-N\t7-p1\lichee\linux-3.10\output\boot.img /mnt/udisk/boot.img
* daemon started successfully
Z:\t7\android-N\t7-p1\lichee\linux-3.10\output\boot.img: 1 file pushed. 5.1 MB/s (16443392 bytes in 3.085s)
E:\cmder_mini
λ adb pshell dd if=/mnt/udisk/boot.img of=/dev/block/by-name/boot
32116+0 records in
32116+0 records out
16443392 bytes transferred in 2.233 secs (7363811 bytes/sec)
E:\cmder_mini
λ adb reboot
3. 進入uboot查看修改
sunxi#fdt list serial1
uart@05000400 {
compatible = "allwinner,sun8i-uart";
device_type = "uart1";
reg = <0x00000000 0x05000400 0x00000000 0x00000400>;
interrupts = <0x00000000 0x0000003d 0x00000004>;
clocks = <0x00000022>;
cshang = <0x00000003>;
pinctrl-names = "cshang", "sleep";
uart1_port = <0x00000001>;
uart1_type = <0x00000002>;
use_dma = <0x00000001>;
status = "disabled";
pinctrl-0 = <0x00000122>;
pinctrl-1 = <0x00000123>;
};
- 結果:數值和名字沒有發生改變。
- 結論:此方法失敗,編譯kernel ,dd導入boot.img不能改變機器中的dts內容。
方法三:pack, dd導入u-boot.fex
注意:pack會重新生成u-boot.fex,編譯kernel不會影響u-boot.fex
- 修改內容:
uart1: uart@05000400 {
compatible = "allwinner,sun8i-uart";
device_type = "uart1";
reg = <0x0 0x05000400 0x0 0x400>;
interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk_uart1>;
cshang = <5>;/*數值改爲5*/
pinctrl-names = "cshang5", "sleep";/*名字改爲cshang5*/
pinctrl-0 = <&uart1_pins_a>;
pinctrl-1 = <&uart1_pins_b>;
uart1_port = <1>;
uart1_type = <4>;
use_dma = <1>;
status = "disabled";
};
- 測試流程:
- pack
- 把pack出來的u-boot.fex導入到機器
E:\cmder_mini
λ adb push Z:\t7\android-N\t7-p1\lichee\tools\pack\out\u-boot.fex /mnt/udisk/u-boot.fex
adb server version (31) doesn't match this client (41); killing...
* daemon started successfully
Z:\t7\android-N\t7-p1\lichee\tools\pack\out\u-boot.fex: 1 file pushed. 4.7 MB/s (950272 bytes in 0.194s)
E:\cmder_mini
λ adb shell
t7-p1:/ # echo '0' > "/sys/block/mmcblk0boot1/force_ro"
t7-p1:/ # dd if=/mnt/udisk/u-boot.fex of=/dev/block/mmcblk0 bs=512 count=64 seek=32800
64+0 records in
64+0 records out
32768 bytes transferred in 0.006 secs (5461333 bytes/sec)
t7-p1:/ # dd if=/mnt/udisk/u-boot.fex of=/dev/block/mmcblk0 bs=512 count=64 seek=24576
64+0 records in
64+0 records out
32768 bytes transferred in 0.004 secs (8192000 bytes/sec)
t7-p1:/ # reboot
- 結果:機器重啓後直接進入強制刷機模式。
- 結論:此方法失敗,pack, dd導入u-boot.fex此方法無效。
方法四:編譯kernel,extract-bsp,pack,燒錄工具不選擇任何分區
- 修改內容
uart1: uart@05000400 {
compatible = "allwinner,sun8i-uart";
device_type = "uart1";
reg = <0x0 0x05000400 0x0 0x400>;
interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk_uart1>;
cshang = <6>;/*修改數字爲6*/
pinctrl-names = "cshang6", "sleep";/*修改名字爲cshang6*/
pinctrl-0 = <&uart1_pins_a>;
pinctrl-1 = <&uart1_pins_b>;
uart1_port = <1>;
uart1_type = <4>;
use_dma = <1>;
status = "disabled";
};
- 試驗流程
- 編譯kernel
- extract-bsp
- pack
- 燒錄工具不選擇任何分區,至燒錄boot0、boot1。
- 進入uboot查看修改
- 結果:成功
sunxi#fdt list serial1
uart@05000400 {
compatible = "allwinner,sun8i-uart";
device_type = "uart1";
reg = <0x00000000 0x05000400 0x00000000 0x00000400>;
interrupts = <0x00000000 0x0000003d 0x00000004>;
clocks = <0x00000022>;
cshang = <0x00000006>;
pinctrl-names = "cshang6", "sleep";
uart1_port = <0x00000001>;
uart1_type = <0x00000002>;
use_dma = <0x00000001>;
status = "disabled";
pinctrl-0 = <0x00000122>;
pinctrl-1 = <0x00000123>;
};
省去其中編譯kernel,extract-bsp再嘗試:失敗!
- 結論:上面的一步都不能少,否則失敗!
試驗結論
方法四:編譯kernel,extract-bsp,pack,燒錄工具不選擇任何分區是最快的方法。