spi我也遇到过卡死的问题,不是这个大佬的代码,是代理给的代码。resetfifo后,没等reset结束,直接读数据,就会卡死。我把它改成resetfifo后,判断一下reset完成再进行下一步就不会卡死了。
Q
qinlinbin 发布的最佳帖子
-
回复: t113 spi原厂驱动有问题
-
回复: t113 spi原厂驱动有问题
@yy_fly 仅供参考!!!spi-sunxi.c文件。
/* reset fifo */ static void spi_reset_fifo(void __iomem *base_addr) { u32 reg_val = readl(base_addr + SPI_FIFO_CTL_REG); u32 poll_time = 0x7ffffff; reg_val |= (SPI_FIFO_CTL_RX_RST|SPI_FIFO_CTL_TX_RST); /* Set the trigger level of RxFIFO/TxFIFO. */ reg_val &= ~(SPI_FIFO_CTL_RX_LEVEL|SPI_FIFO_CTL_TX_LEVEL); reg_val |= (0x20<<16) | 0x20; writel(reg_val, base_addr + SPI_FIFO_CTL_REG); /*添加的内容*/ reg_val = 0; reg_val = readl(base_addr + SPI_FIFO_CTL_REG); while((reg_val & SPI_FIFO_CTL_RX_RST || reg_val & SPI_FIFO_CTL_TX_RST) && --poll_time) reg_val = readl(base_addr + SPI_FIFO_CTL_REG); } static int sunxi_spi_cpu_readl(struct spi_device *spi, struct spi_transfer *t) { struct sunxi_spi *sspi = spi_master_get_devdata(spi->master); void __iomem *base_addr = sspi->base_addr; unsigned rx_len = t->len; /* number of bytes sent */ unsigned char *rx_buf = (unsigned char *)t->rx_buf; unsigned int poll_time = 0x7ffffff; unsigned int i, j; u8 buf[64], cnt = 0; while (rx_len && (--poll_time > 0)) { /* rxFIFO counter */ if (spi_query_rxfifo(base_addr)) { *rx_buf++ = readb(base_addr + SPI_RXDATA_REG); --rx_len; } } /*余下的没改*/ }
qinlinbin 发布的最新帖子
-
回复: rs485的设备树怎么修改
@awwwwa 你好。这两种设备树的485定义,我在5.4内核和5.10内核中都没有找到响应的定义,请问这是在哪个驱动代码里面实现的呢?我在a40-i的5.10内核,甚至没有找到sunxi-uart.c这个文件,这个正常吗?
-
回复: t113-s3开启多个串口dma问题
@codedogejack123 没有,只是把DMA_SERIAL_BUFFER_SIZE改成了2k,凑合着使用。假如你有解决方法,麻烦分享一下。
-
回复: T113-s3 CAN linux 下已调通
大佬,想问一下,你有测试过80k以下波特率的吗?我试了一下,会报这个错误。
ip link set can0 type can bitrate 50000
sunxi_can 2504000.can can0: bitrate error 8589934.5% too high。你有遇到过吗? -
回复: 通过USB共享使D1s上的tina联网(RNDIS Gadget)
@maihuanyi udc dma(sunxi_udc.c)相关的有bug,问问供应商或者论坛大佬要要补丁。