@yuzukitsuru
1.大佬是用什么sdk的呀?我用的是韦东山提供的buildroot工程neza-d1-buildroot,
2.然后感觉那个uboot有点问题,不会遍历dts中第二层级的device,我在源码上参照那个clocks的来遍历第二层,第三层的device,在uboot 输入dm tree可以正常显示device对应的层级关系。只是第三层级的spinor没有绑定成功
///drivers/core/root.c
350 /* bind fixed-clock */
351 node = ofnode_path("/clocks");
352 /* if no DT "clocks" node, no need to go further */
~ 353 if (!ofnode_valid(node)){
+ 354 pr_debug("debug, not found ofnode_valid node\n");
355 return ret;
+ 356 }
+ 364
+ 365 //直接进入到这里执行
+ 366 pr_debug("debug, dm_scan_fdt_node\n\n");
367 ret = dm_scan_fdt_node(gd->dm_root, gd->fdt_blob, node.of_offset,
368 pre_reloc_only);
369 if (ret)
~ 370 pr_debug("dm_scan_fdt_node() failed: %d\n", ret);
+ 371
+ 372
+ 373 pr_debug("\n\n");
+ 374 node = ofnode_path("/hello_dts_name@1234");
+ 375 if (!ofnode_valid(node)){
+ 376 pr_debug("find node faile\n");
+ 377 return ret;
+ 378 }
+ 379
+ 380 ret = uclass_get_device_by_name(UCLASS_HELLO_CJ, "hello_dts_name@1234", &getdev);
+ 381 if (ret){
+ 382 pr_debug("debug, can not get device hello\n");
+ 383 ret = uclass_get_device_by_driver(UCLASS_HELLO_CJ, DM_GET_DRIVER(hello_drv), &getdev);
+ 384 if (ret){
+ 385 pr_debug("debug, stil can not find device\n");
+ 386 }
+ 387 }
+ 388 ret = dm_scan_fdt_node(getdev, gd->fdt_blob, node.of_offset,pre_reloc_only);
+ 389 if (ret){
+ 390 pr_debug("dm_scan_fdt node faile\n");
+ 391 }
修改后的串口dm tree打印
=> dm tree
Class Probed Driver Name
----------------------------------------
root [ + ] root_drive root_driver
hello_cj_c [ + ] hello_drv |-- hello_dts_name@1234
hello_cj_c [ ] hello_drv_ | `-- hello_dts_child@5678
spi_flash [ ] spi_flash_ `-- spi@04026000
=>
uboot的spi1 dts配置
//uboot-origin_master/arch/riscv/dts/sun20iw1p1-soc-system.dts
6 /dts-v1/;
11 / {
12 model = "sun20iw1";
13 compatible = "allwinner,riscv", "arm,sun20iw1p1";
14 #address-cells = <2>;
15 #size-cells = <2>;
+ 18 hellohqh: hello_dts_name@1234 {
+ 19
+ 20 #address-cells = <1>;
+ 21 #size-cells = <0>;
+ 22 compatible = "hello_dts";
+ 23 reg = <0x02000000>;
+ 24 pinctrl-names = "default", "sleep";
+ 25 pinctrl-0 = <&gpiotest_pins>;
+ 26
+ 27 hellohqh1: hello_dts_child@5678 {
+ 28 compatible = "hello_child_dts";
+ 29 reg = <0x31>;
+ 30 hellohqh2: hello_dts_child_child@99991 {
+ 31 compatible = "hello_child_child_dts";
+ 32
+ 33 };
+ 34 };
+ 35 };
37 soc: soc@29000000 {
38 #address-cells = <2>;
39 #size-cells = <2>;
+ 427 spi1: spi@04026000 {
+ 428 //#address-cells = <1>;
+ 429 //#size-cells = <0>;
+ 430 compatible = "allwinner,sun20i-spi";
+ 431 device_type = "spi1";
+ 432 reg = <0x0 0x04026000 0x0 0x1000>;
+ 433 //interrupts-extended = <&plic0 31 IRQ_TYPE_LEVEL_HIGH>;
+ 434 //clocks = <&ccu CLK_PLL_PERIPH0>, <&ccu CLK_SPI0>, <&ccu CLK_BUS_SPI0>;
+ 435 //clock-names = "pll", "mod", "bus";
+ 436 //resets = <&ccu RST_BUS_SPI0>;
+ 437 clock-frequency = <100000000>;
+ 438 pinctrl-names = "default", "sleep";
+ 439 spi1_cs_number = <1>;
+ 440 spi1_cs_bitmap = <1>;
+ 441 spi_slave_mode = <0>;
+ 442 //dmas = <&dma 22>, <&dma 22>;
+ 443 //dma-names = "tx", "rx";
+ 444 pinctrl-0 = <&spi1_pins_a &spi1_pins_b>;
+ 445 pinctrl-1 = <&spi1_pins_c>;
+ 446 status = "okay";
+ 447 spi-nor {
+ 448 compatible = "jedec,spi-nor";
+ 449 spi-max-frequency=<0x5F5E100>;
+ 450 reg = <0x0>;
+ 451 spi-rx-bus-width=<0x01>;
+ 452 spi-tx-bus-width=<0x01>;
+ 453 status="okay";
+ 454 };
+ 455 };
+ 273 spi1_pins_a: spi1@0 {
+ 274 allwinner,pins = "PD11", "PD12", "PD13","PD14", "PD15";
+ 275 allwinner,pname = "spi1_sclk", "spi1_mosi","spi1_miso", "spi1_hold", "spi1_wp";
+ 276 allwinner,function = "spi1";
+ 277 allwinner,muxsel = <4>;
+ 278 allwinner,drive = <1>;
+ 279 allwinner,pull = <0>;
+ 280 };
+ 281
+ 282 spi1_pins_b: spi1@1 {
+ 283 allwinner,pins = "PD10";
+ 284 allwinner,pname = "spi1_cs0";
+ 285 allwinner,function = "spi1";
+ 286 allwinner,muxsel = <4>;
+ 287 allwinner,drive = <1>;
+ 288 allwinner,pull = <1>; // only CS should be pulled up
+ 289 };
+ 290
+ 291 spi1_pins_c: spi1@2 {
+ 292 allwinner,pins = "PD10", "PD11", "PD12", "PD13","PD14", "PD15";
+ 293 allwinner,function = "gpio_in";
+ 294 allwinner,muxsel = <0>;
+ 295 allwinner,drive = <1>;
+ 296 allwinner,pull = <0>;
+ 297 };
307 };
3.我看了一下drivers/sunxi_flash/sunxi_flash.c,貌似不是基于DM模型的驱动,这个是怎么调用的呀?大佬是否可以指导指导,还在学习阶段好多东西都不懂