<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[在uboot下调用spi的sf_dataflash驱动报错]]></title><description><![CDATA[<p dir="auto">基于 韦东山的neza-d1-buildroot源码<br />
1.make menuconfig，选择spi以及允许DM<br />
2.配置dts</p>
<pre><code>+         spi1: spi@04026000 {
+             //#address-cells = &lt;1&gt;;
+             //#size-cells = &lt;0&gt;;
+             compatible = "allwinner,sun20i-spi";
+             device_type = "spi1";
+             reg = &lt;0x0 0x04026000 0x0 0x1000&gt;;
+             //interrupts-extended = &lt;&amp;plic0 31 IRQ_TYPE_LEVEL_HIGH&gt;;
+             //clocks = &lt;&amp;ccu CLK_PLL_PERIPH0&gt;, &lt;&amp;ccu CLK_SPI0&gt;, &lt;&amp;ccu CLK_BUS_SPI0&gt;;
+             //clock-names = "pll", "mod", "bus";
+             //resets = &lt;&amp;ccu RST_BUS_SPI0&gt;;
+             clock-frequency = &lt;100000000&gt;;
+             pinctrl-names = "default", "sleep";
+             spi1_cs_number = &lt;1&gt;;
+             spi1_cs_bitmap = &lt;1&gt;;
+             spi_slave_mode = &lt;0&gt;;
+             //dmas = &lt;&amp;dma 22&gt;, &lt;&amp;dma 22&gt;;
+             //dma-names = "tx", "rx";
+             pinctrl-0 = &lt;&amp;spi1_pins_a &amp;spi1_pins_b&gt;;
+             pinctrl-1 = &lt;&amp;spi1_pins_c&gt;;
+             status = "okay";
+             spi-nor {
+                 compatible = "jedec,spi-nor";
+                 spi-max-frequency=&lt;0x5F5E100&gt;;
+                 reg = &lt;0x0&gt;;
+                 spi-rx-bus-width=&lt;0x01&gt;;
+                 spi-tx-bus-width=&lt;0x01&gt;;
+                 status="okay";
+             };
+         };
+
+

+             spi1_pins_a: spi1@0 {
+                 allwinner,pins = "PD11", "PD12", "PD13","PD14", "PD15";
+                 allwinner,pname = "spi1_sclk", "spi1_mosi","spi1_miso", "spi1_hold", "spi1_wp";
+                 allwinner,function = "spi1";
+                 allwinner,muxsel = &lt;4&gt;;
+                 allwinner,drive = &lt;1&gt;;
+                 allwinner,pull = &lt;0&gt;;
+             };
+
+             spi1_pins_b: spi1@1 {
+                 allwinner,pins = "PD10";
+                 allwinner,pname = "spi1_cs0";
+                 allwinner,function = "spi1";
+                 allwinner,muxsel = &lt;4&gt;;
+                 allwinner,drive = &lt;1&gt;;
+                 allwinner,pull = &lt;1&gt;;   // only CS should be pulled up
+             };
+
+             spi1_pins_c: spi1@2 {
+                 allwinner,pins = "PD10", "PD11", "PD12", "PD13","PD14", "PD15";
+                 allwinner,function = "gpio_in";
+                 allwinner,muxsel = &lt;0&gt;;
+                 allwinner,drive = &lt;1&gt;;
+                 allwinner,pull = &lt;0&gt;;
+             };
</code></pre>
<p dir="auto">3.自定义一个cmd/hello程序，通过uclass_get_device_by_name获取device。执行write方法，串口输出有报错，</p>
<pre><code>Unhandled exception: Load access fault
EPC: 000000005ff2d380 TVAL: 00000002e3035e0a
### ERROR ### Please RESET the board ###
</code></pre>
]]></description><link>https://bbs.aw-ol.com/topic/1684/在uboot下调用spi的sf_dataflash驱动报错</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 18:55:22 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/1684.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Jun 2022 07:32:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 在uboot下调用spi的sf_dataflash驱动报错 on Fri, 01 Jul 2022 06:21:26 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://bbs.aw-ol.com/uid/44">@whycan</a> 刚开始贴的log打印，应该是程序的一些空指针的操作导致系统挂了</p>
]]></description><link>https://bbs.aw-ol.com/post/8256</link><guid isPermaLink="true">https://bbs.aw-ol.com/post/8256</guid><dc:creator><![CDATA[haiqianghuang69]]></dc:creator><pubDate>Fri, 01 Jul 2022 06:21:26 GMT</pubDate></item><item><title><![CDATA[Reply to 在uboot下调用spi的sf_dataflash驱动报错 on Fri, 01 Jul 2022 08:09:48 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://bbs.aw-ol.com/uid/44">@whycan</a><br />
1.追查下来发现在绑定udevice的时候，probe没有获取到一个size，导致没有给一个parent_priv分配内存空间，尝试在U_BOOT_DRIVER上面添加一个per_child_auto_alloc_size，但没有生效，就直接在源码上赋值了（从其他地方打印这个size值为48）</p>
<pre><code> 181 U_BOOT_DRIVER(spi_flash_std) = {
  182     .name       = "spi_flash_std",
  183     .id     = UCLASS_SPI_FLASH,
  184     .of_match   = spi_flash_std_ids,
  185     .probe      = spi_flash_std_probe,
  186     .remove     = spi_flash_std_remove,
  187     .priv_auto_alloc_size = sizeof(struct spi_flash),
+ 188     .per_child_auto_alloc_size = sizeof(struct spi_slave),//在这里赋值没有生效
  189     .ops        = &amp;spi_flash_std_ops,
  190 };

//drivers/core/device.c
 343     if (dev-&gt;parent) {
+ 344         printf("device_probe, get parent size\n");
  345         size = dev-&gt;parent-&gt;driver-&gt;per_child_auto_alloc_size;
  346         if (!size) {
~ 348             size = dev-&gt;parent-&gt;uclass-&gt;uc_drv-&gt;per_child_auto_alloc_size;
  349         }
+ 350         if (!size){
+ 352             //size = sizeof(struct spi_slave);//有报错
+ 353             size = 48;//通过其他地方打印的spi_slave大小
+ 354         }
+ 355
  357         if (size &amp;&amp; !dev-&gt;parent_priv) {//分配parent_priv空间
  358             dev-&gt;parent_priv = alloc_priv(size, drv-&gt;flags);
  360             if (!dev-&gt;parent_priv) {
  362                 ret = -ENOMEM;
  363                 goto fail;
  364             }
  365         }
  366

</code></pre>
<p dir="auto">2.搞完第一步后，发现上电后就卡住了，经加log发现是在spi_claim_bus这里运行不下去</p>
<pre><code>//drivers/mtd/spi/sf_probe.c
 25 static int spi_flash_probe_slave(struct spi_flash *flash)
   26 {
   27     struct spi_slave *spi = flash-&gt;spi;//通过打印，flash传进来的是udevice ,spi@04026000
   28     int ret;
   29
   30     /* Setup spi_slave */
   31     if (!spi) {
   33         return -ENODEV;
   34     }
   35
   37     /* Claim spi bus */
~  38     ret = spi_claim_bus(spi);//这里是调用到drivers/spi/spi-uclass.c的实现
   39     if (ret) {
   40         debug("SF: Failed to claim SPI bus: %d\n", ret);
   41         return ret;
   42     }

//drivers/spi/spi-uclass.c
int spi_claim_bus(struct spi_slave *slave)
{
    return log_ret(dm_spi_claim_bus(slave-&gt;dev));
}
50 int dm_spi_claim_bus(struct udevice *dev)
   51 {
+  52     pr_err("spi/spi-uclass, spi_claim_bus-&gt;dm_spi_claim_bus\n\n");
+  53
   54     struct udevice *bus = dev-&gt;parent;
~  55     if (bus == NULL){
+  56         pr_err("debug, is null pointer\n");
+  57     }else{
+  58         pr_err("debug, spi_get_ops, bus = dev-&gt;parent, , \n");//貌似不能直接获取结构体内容
+  61         struct dm_spi_ops *ops = spi_get_ops(bus);//这里的bus应该是一个父设备，这里获取父设备的ops，最终是卡在这里，spi_get_ops是获取bus-&gt;driver-&gt;ops
+  62     }
+  63

</code></pre>
<p dir="auto">分析代码是spi_claim_bus函数里面想拿执行spi_get_opt(bus)，但程序跑到这里就卡住没往下执行了，应该是一个空的内容</p>
<p dir="auto">串口打印如下：</p>
<pre><code>[02.207]debug, spi_claim_bus, 
[02.210]spi/spi-uclass, spi_claim_bus-&gt;dm_spi_claim_bus

[02.215]debug, spi_get_ops, bus = dev-&gt;parent, , 

</code></pre>
]]></description><link>https://bbs.aw-ol.com/post/8255</link><guid isPermaLink="true">https://bbs.aw-ol.com/post/8255</guid><dc:creator><![CDATA[haiqianghuang69]]></dc:creator><pubDate>Fri, 01 Jul 2022 08:09:48 GMT</pubDate></item><item><title><![CDATA[Reply to 在uboot下调用spi的sf_dataflash驱动报错 on Fri, 01 Jul 2022 04:29:33 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="https://bbs.aw-ol.com/uid/1364">@haiqianghuang69</a><br />
是怎么失败的呢，有没有日志信息呢？</p>
]]></description><link>https://bbs.aw-ol.com/post/8254</link><guid isPermaLink="true">https://bbs.aw-ol.com/post/8254</guid><dc:creator><![CDATA[whycan]]></dc:creator><pubDate>Fri, 01 Jul 2022 04:29:33 GMT</pubDate></item><item><title><![CDATA[Reply to 在uboot下调用spi的sf_dataflash驱动报错 on Fri, 01 Jul 2022 03:24:05 GMT]]></title><description><![CDATA[<p dir="auto">尝试在D1的uboot上实现一个nor flash的读写的功能，想直接用drivers/mtd/spi/sf_dataflash.c的驱动程序，但调用失败。求问各位大佬怎么在uboot下实现一个nor flash的读写</p>
]]></description><link>https://bbs.aw-ol.com/post/8253</link><guid isPermaLink="true">https://bbs.aw-ol.com/post/8253</guid><dc:creator><![CDATA[haiqianghuang69]]></dc:creator><pubDate>Fri, 01 Jul 2022 03:24:05 GMT</pubDate></item></channel></rss>