RK3588平台spi传输

文章讲述了在RK3588平台上使用spi协议与加密芯片交互时遇到的问题,芯片要求每次传输前CS信号需保持低50ms。通过分析驱动底层代码,发现在spi_transfer_one_message中加入udelay(50)解决延时问题,确保正确通信。
摘要由CSDN通过智能技术生成

背景

RK3588平台需要使用spi协议与自主设计的加密芯片进行交互,加密芯片使用spidev驱动进行交互,该芯片要求在每次进行传输前拉低片选信号线(CS)50ms以上,否则会报告通讯失败。

问题

使用上述spidev驱动代码可以与加密芯片正常交互,但是芯片的返回结果是错误的,使用示波器观察信号质量以及信号时序未发现错误,排查由于硬件设计导致的时序错误问题。与芯片的fae交流得知在每次交互前需要将片选信号(cs)拉低50ms以上,但是user mode spi driver并未提供相应的接口配置该延时时间。

解决方法

从瑞芯微提供的驱动底层入手,观察每次的spi传输过程。

RK3588s.dtsi中设备树中spi控制器的定义如下:

	spi0: spi@feb00000 {
		compatible = "rockchip,rk3066-spi";
		reg = <0x0 0xfeb00000 0x0 0x1000>;
		interrupts = <GIC_SPI 326 IRQ_TYPE_LEVEL_HIGH>;
		#address-cells = <1>;
		#size-cells = <0>;
		clocks = <&cru CLK_SPI0>, <&cru PCLK_SPI0>;
		clock-names = "spiclk", "apb_pclk";
		dmas = <&dmac0 14>, <&dmac0 15>;
		dma-names = "tx", "rx";
		pinctrl-names = "default";
		pinctrl-0 = <&spi0m0_cs0 &spi0m0_cs1 &spi0m0_pins>;
		num-cs = <2>;
		status = "disabled";
	};

根据compatible属性搜索使用的驱动,搜索结果如下:

./spi-rockchip.c:       { .compatible = "rockchip,rk3066-spi", },

在该驱动的probe函数中调用devm_spi_register_controller向spi子系统注册spi控制器,进一步追踪devm_spi_register_controller,该函数调用spi_register_controller,该函数进一步调用spi_controller_initialize_queue,spi_controller_initialize_queue初始化spi队列化传输,spi传输由一个kernel thread负责,spi传输队列的pump操作最终由spi_pump_message实现,该函数调用ctlr->transfer_one_message进行一次数据传输,而ctlr->transfer_one_message在spi_controller_initialize_queue中被初始化为spi_transfer_one_message。也就是每一次的spi传输最终由spi_transfer_one_message实现。在spi_transfer_one_message中首先调用spi_set_cs将cs拉低,然后调用平台特定的ctlr->transfer_one完成一次数据传输。因此我们只需要在spi_set_cs后调用udelay(50)即可完成目标。梳理一下代码

//spi-rockchip.c
rockchip_spi_probe //rk3588平台spi驱动的探测函数调用devm_spi_register_controller
//spi.c
devm_spi_register_controller //对spi_register_controller的封装
//spi.c
spi_register_controller  //向spi core注册spi控制器 调用 spi_controller_initialize_queue
// spi.c
spi_controller_initialize_queue
// 初始化ctlr->transfer_one_message = spi_transfer_one_message; 调用spi_init_queue 初始化spi队列化传输,spi队列化传输由__spi_pump_messages实现 __spi_pump_messages调用ctlr->transfer_one_message
//spi.c
spi_transfer_one_message //调用spi_set_cs拉低cs线,调用ctrl->transfer_one完成一次传输
    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值