背景:
msm8909平台,c文件测试spi_0的一次记录
测试文件就是写个c文件,编译进内核,引用dtsi里的spi_0,主要probe里面这个函数,进行的SPI的环测试:
static int spi_test_transfer(struct spi_device* spi)
{
spi->mode |= SPI_LOOP;
//初始化spi_message
spi_message_init(&spi_msg);
//初始化spi_tansfer
spi_xfer.tx_buf = tx_buf;
spi_xfer.len = BUFFER_SIZE;
spi_xfer.bits_per_word = 8;
spi_xfer.speed_hz = spi->max_speed_hz;
//将新的spi_transfer添加到spi_msg队列尾部
spi_message_add_tail(&spi_xfer, &spi_msg);
//调用spi_master发送spi_message
return spi_sync(spi, &spi_msg);
}
没用串口线,开机查看的dmesg, 中间遇到过几个问题。虽然是简单的问题,但是实际中还是会遇到。
1.没看到log,module_init好像没进
a.检查compatible, 发现没问题,driver和dtsi(device)是一样的
b.惯性思维,去设置CONFIG_LOG_BUF_SHIFT为16,我以为够了,以前都是够的,好久才想过来。为什么不设置成18呢,然后看了下log时间,保险的肯定要从0开始看的,因为kernel起来后,我们也不知道这个module_init到底什么时候进。之前都是3秒左右开始的(前面几秒的环形区刷了)
2.probe跑了后遇到后面截图的问题
错误时SPI transation timeout, 然后 SPI sync return -5。 正常时是返回0 .
然后也想了好一会儿,一开始我以为是irq gpio有问题, 因为这个数字太大了。
但是我在dtsi里面换了个gpio,实际中这个数字还是会变化,所以这个没问题。这个跟实际的硬件gpio的num应该不是一样的。(为毛我看别的文档是一样的,还有是tp的irq在log和dtsi里面怎么是一样的,暂时没想明白)
然后我实在没办法了,这里也是一个惯性思维的错。
spi的几个脚是sdk默认默认配置的。后面去检查了,发现CLK错了。。。。这。。。。
查看msm8909 BLSP配置:
所以,当实在没办法是,还是从可以信赖的基础开始排查吧。
不迷信以前别人改的,不迷信之前的代码,不要惯性思维。