bringup 的過程中,dts需要不斷的修改 ,所以需要學習dtb 調試的方法加以配合
活动地址:CSDN21天学习挑战赛
學習計畫
1,學習目標
1.dtb debug
2,學習內容
- DTB 的基本調試方法
- 內核啟動階段獲得dtb 位置指針過程介紹
3,學習時間
週一至週五晚上八至十點
週六至週日晚上八至十點
4,學習產出
一週三篇
學習筆記
- DTS、DTC、DTB三者之間的關系
文件 | 意義 |
---|---|
DTS | 設備樹源碼 |
DTC | 工具 |
DTB | DTS的二進制檔 |
- 範例: 新增一個Camera 設備
1.新增一個Camera設備,首先需要在dts中加入此設備的描述
aml_cams{
compatible = "amlogic,cams_prober"; //与驱动匹配的设备描述
status = "disabled";
pinctrl-names = "gpio","csi";
pinctrl-0 = <&aml_cam_gpio_pins> ;
pinctrl-1 = <&aml_cam_csi_pins> ;
……
cam_1{
cam_name = "ov5647"; //camera的型号
front_back = <0>; //前camera或者后camera 标志
i2c_bus = "i2c_bus_d"; //挂载 i2c 总线的位置。
gpio_pwdn = "GPIOH_5"; //电源开关的gpio
gpio_rst = "GPIOH_4"; //复位控制的gpio
mirror_flip = <0>; //左右镜像 控制
vertical_flip = <0>; //上下翻转 控制
config_path = "/system/etc/camera_isp_cfg/ov5647_cw0767"; // isp 配置文件位置
bt_path = "csi"; //csi 控制器
interface = "mipi"; //接口属性
clk_channel = "b"; //clk的通道
status = "okay";
};
……
};
2.create device driver
static const struct of_device_id cams_prober_dt_match[] = {{
.compatible =
"amlogic, cams_prober", //与dts文件中的aml_cams ->compatible 进行匹配 找到amlogic camera的设备
}, {},
};
static struct platform_driver aml_cams_prober_driver = {
.probe = aml_cams_probe, .remove = aml_cams_remove, .driver = {
.name = "aml_cams_prober",
.owner = THIS_MODULE,
.of_match_table = cams_prober_dt_match,
},
};
static struct i2c_driver ov5647_i2c_driver = {
.driver = {
.name = "ov5647", //在i2c总线上 与dts文件中cam_1->cam_name 进行匹配找到 ov5647的sensor
},
.probe = ov5647_probe,
.remove = ov5647_remove,
.id_table = ov5647_id,
};
3.在driver中調用系統API,讓dts 與 driver 產生關聯(common\include\linux\of.h)
I2c_bus → of_property_read_string(p_node, "i2c_bus", &str);
Cam_name → of_property_read_string(p_node, "cam_name", &cam_dev->name);
Front_back → of_property_read_u32(p_node, "front_back", &cam_dev->front_back);
Mirror_flip → of_property_read_u32(p_node, "mirror_flip", &cam_dev->m_flip);
- 單獨編譯dtb的方法
source build/envsetup.sh
lunch 选择自己的项目平台 xxx
make dtbimage
- dtb image 使用 sd 卡進行燒錄
Uboot$: mmc dev 0
Uboot$: mmcinfo
Uboot$: fatload mmc 0 $loadaddr dtb.img
Uboot$: store dtb write $loadaddr
- 調試
get_partition_from_dts: FDT_ERR_BADMAGIC
!!!!get dts FAILED
//如現如上錯誤,表示amlogic-dt-id取值結果與目標不符
S9BOX # fdt addr 0x1000000
S9BOX # fdt print
//使用上述指令可print dtb 的文本內容,以此可以得知是否燒錯 dtb檔案
- 底層dts會覆蓋上層 dts內容
rv1126.dtsi 指定 pwm0 為 disable ,但後續 rv1126-evb.dtsi 再次將 pwm0 enable,基於底層覆蓋上層,最終 pwm0 enable.
#rv1126.dtsi
#include rv1126-evb.dtsi
&pwm0 {
status = "disable";
};
#rv1126-evb.dtsi
&pwm0 {
status = "okay";
};