调试MT7688的SPI:改造内核SPI驱动

MT7688内核的SPI驱动位于:

build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7688/linux-3.18.45/drivers/spi/spi-mt7621.c

在用户态打开spi设置,测试transfer时发现驱动对数据长度有限制,阅读驱动代码发现半双工写入的限制为36bytes:

在mt7621_spi_transfer_half_duplex函数中,有如下判断:

if (WARN_ON(len + rlen > 36)) 
{
	status = -EIO;
	goto msg_done;
}
初步分析其原因:该SPI驱动主要是为了 配合MT7688的SPI Controller控制外挂的SPI FLASH而设计的。

通过阅读MT7688的datasheet并结合现有驱动代码,可知SPI控制器的数据缓存由SPI_OP_ADDR(10000B04)以及SPI_DIDO_0(10000B08)-SPI_DIDO_7(10000B24)共计9个32bit位宽(36bytes)的寄存器构成。

通过改造mt7621_spi_transfer_half_duplex函数->mt7621_spi_transfer_half_duplex_cs1,使其支持多字节读写:

static int mt7621_spi_transfer_one_message(struct spi_master *master,
					   struct spi_message *m)
{
	struct spi_device *spi = m->spi;
	int cs = spi->chip_select;

	if(cs == 0)
	{
		return mt7621_spi_transfer_half_duplex(master, m);
	}
	else if(cs == 1)
	{
		return mt7621_spi_transfer_half_duplex_cs1(master, m);
	}
	
	return 0;
}


static int mt7621_spi_transfer_half_duplex_cs1(struct spi_master *master,
					   struct spi_message *m)
{
	struct mt7621_spi *rs = spi_master_get_devdata(master);
	struct spi_device *spi = m->spi;
	unsigned int speed = spi->max_speed_hz;
	struct spi_transfer *t = NULL;
	int status = 0;
	int i=0;
	
	u8* tbuf;
	u8 *rbuf;

	u32 data[9];
	u32 val=0;
	
	u32 r_index=0;
	u8 n_xfer=0;
	int tmp =0 ;

	u32 n_byte_to_write=0;
	u32 n_byte_to_read=0;
	u32 rw_left=0;
	
	u32 tdata=0;	
	tbuf = (u8*)kbuf;

	tmp = mt7621_spi_wait_till_ready(spi);
	if(tmp != 0)
	{
		status = -EIO;
		goto msg_done;
	}

	list_for_each_entry(t, &m->transfers, transfer_list) 
	{
		const u8 *buf = t->tx_buf; // send buffer
		int rlen = t->len;	// length to read or write.		
		
		if (t->rx_buf)
		{
			n_byte_to_read += rlen;
			rbuf = t->rx_buf;
		}

		if (!buf)	// send buffer
			continue;

		//update speed
		if (t->speed_hz < speed)
			speed 
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在MT6735上调试SPI屏幕,我们需要进行以下步骤: 1. 确认硬件连接:首先,要确保正确地连接了MT6735的SPI引脚和显示屏的SPI接口。检查引脚连接是否准确无误,确保电源和地线正确连接。 2. 配置软件参数:我们需要在MT6735的软件层面进行配置,以确保正确使用SPI接口与屏幕进行通信。可以通过修改设备树文件进行配置,指定SPI接口的相关参数,例如时钟频率、工作模式等。 3. 编写SPI驱动程序:我们需要编写一个SPI驱动程序来管理SPI接口与屏幕之间的通信。可以使用Linux内核提供的SPI驱动接口来简化开发工作。在驱动程序中,我们需要实现发送和接收数据的函数,以便与屏幕进行数据交互。 4. 进行功能测试:完成驱动程序的编写后,我们需要进行功能测试以确保SPI屏幕的正常工作。可以通过发送一些测试数据并观察屏幕的反馈来进行测试。如果屏幕能够正确显示所发送的数据,则表示调试成功。 5. 优化和调试:如果在测试过程中发现屏幕显示不正常或者存在其他问题,我们需要进行进一步的优化和调试。可以通过修改驱动程序,调整时序参数,或者检查硬件连接等方式来解决问题。 总之,在MT6735上调试SPI屏幕需要确保正确的硬件连接,并进行软件参数配置和驱动程序编写。通过功能测试和优化调试,最终可以使SPI屏幕在MT6735上正常工作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值