linux内核版本:3.2
背景:
使用AM335X的SPI模块和EDMA传输数据。去除linux内核里omap2自带的SPI驱动,自己写了一个驱动模块(只是大致写了,作为测试使用),直接配置寄存器(主要是MCSPI相关寄存器、EDMA相关寄存器、模块时钟寄存器)。配置AM335X为主机,工作模式为Master Receive-Only Mode,三线模式,spi字为24位,关闭发送、接收中断。使用SPICS0引脚触发DMA传输,打算让DMA将MCSPI_RX0寄存器里的内容传到自己申请的一个缓存区域,并打印出来。上述操作均放在module_init函数里,insmod安装内核模块时会执行上述操作。insmod安装该模块时,打印出缓存区域里全是0,直接读MCSPI_RX0寄存器发现也全为0。用示波器测试了一下SPI1的CLK引脚,没有时钟输出。
打印出来的寄存器配置如下:
[STEP]# gpios init:
[ 2292.290905] [CM_PER]# L4LS_CLKSTCTRL: 1A024D02
[ 2292.295533] [CM_PER]# SPI1_CLKCTRL: 00000002
[ 2292.300173] [McSPI] Soft Reset OK.
[ 2292.303714] [McSPI-CH0]# REG_MCSPI_CHCONF0: 00061B8C
[ 2292.308892] [McSPI-CH0]# REG_MCSPI_CHSTAT0: 00000000
[ 2292.314065] [McSPI-CH0]# REG_MCSPI_CHCTRL0: 00000000
[ 2292.319242] [McSPI]# Channel-0 Enable.
[ 2292.323144] [McSPI-CH0]# REG_MCSPI_CHCTRL0: 00000001
[ 2292.328336] [McSPI-CH0]# After TX Write: CHSTAT0: 00000000
[ 2292.334049] [McSPI-CH0]# REG_MCSPI_RX0 : 00000000
[ 2292.339228] [McSPI-CH0]# REG_MCSPI_CHSTAT0: 00000000
[ 2292.344400]
[ 2292.344403]
[ 2292.344406] [McSPI-CH0]# REG_MCSPI_CHCONF0: 00061B8C
[ 2292.352665] [McSPI-CH0]# REG_MCSPI_CHSTAT0: 00000000
[ 2292.357845] [McSPI-CH0]# REG_MCSPI_CHCTRL0: 00000001
[ 2292.363015] [McSPI-CH0]# REG_MCSPI_TX0: 00000000
[ 2292.367831] [McSPI-CH0]# REG_MCSPI_RX0: 00000000
[ 2292.372638]
[ 2292.374184] [McSPI]# REG_MCSPI_SYSCONFIG: 00000015
[ 2292.379180] [McSPI]# REG_MCSPI_SYSSTATUS: 00000001
[ 2292.384171] [McSPI]# REG_MCSPI_IRQSTATUS: 00000000
[ 2292.389167] [McSPI]# REG_MCSPI_IRQENABLE: 00000000
[ 2292.394155] [McSPI]# REG_MCSPI_SYST: 00000100
[ 2292.398700] [McSPI]# REG_MCSPI_MODULCTRL: 00000003
[ 2292.403689] [CONF_MII1]# REG_CONF_MII1_COL : 00000022
[ 2292.408956] [CONF_MII1]# REG_CONF_MII1_CRS : 0000003A
[ 2292.414219] [CONF_MII1]# REG_CONF_MII1_RX_ER : 00000022
[ 2292.419668] [CONF_MII1]# REG_CONF_MII1_REF_CLK : 00000029
补充:TRM手册说如果工作在Master Receive-Only Mode,需要提前网tx0寄存器写入一些值,我配置的时候往里面写了0。
问题:
1、为何我insmod内核模块时,CLK引脚没有时钟输出。按我想的,执行module_init函数时DMA会读取RX0寄存器的值,已经开始传输数据了,按理说有时钟输出啊。
2、AM335X的SPI是如何开始一次传输的?只要往TX0寄存器写入内容,或者读取RX0寄存器就算开始传输了吗?
有没有人能解释一下?谢谢各位!