hpi 驱动---与dsp通信
2019-07-13 11:25发布
生成海报
Author-------Dansen-----xzd2734@163.com
Dsp 提供了hpi接口,可以用来和 Arm 通信,一年多前我刚接触Arm的工作就是要写一个hpi接口的驱动。最近真正需要把接口给用起来,又修改了一下代码,添加了中断,不过感觉还是不完美,再看看设备驱动程序这本书再来修改吧。
我们用的是c5416,增强型的8位hpi接口,先看看用到的寄存器吧。
HPI 有三个寄存器:地址寄存器 HPIA,控制寄存器 HPIC 以及数据寄存器 HPID。
接着是HPIC各个位的定义
X位不受写影响,读取是可以是0也可以是1
HPIC的高8位和低8位是一样的
BOB 该比特位只能由主机读写,C54X 无法访问。如果 BOB=1,表示 HPI 的 16 位传输中的第一个 8 位字节是低 8位;BOB=0,表示第一个 8 位字节为高 8 位。该比特位必须在读写数据和地址寄存器之前设置。
XHPIA 扩展地址使能位。XHPIA=1,主机写入的值被装入地址寄存器高位HPIA[n:16]. XHPIA=0, 主机写入的值被装入地址寄存器高位HPIA[15:0]. 只有主机可以读写。Dsp的内存地址从00000000---0003ffff 高位地址只是从0到3有效
HINT 该比特位主机和 C54X都可以读写。该比特决定了 C54X引脚 HINT 的状态。C54X可以利用该信号发送中断到主机。当 C54X 在复位状态时,HINT 比特位为 0,对应的 HINT 脚为高电平。当 C54X 将该比特位设置为 1 时,HINT 脚将变为低电平。注意,当主机和 C54X读取该比特位时,它将反映 HINT 引脚的状态,0 表示高电平,1 表示低电平。另外,该比特位只能由 C54X设置,由主机清除。主机将 1写到该比特位,将清除 HINT位,即 HINT 位为 0。
DSPINT 该比特位只能由主机写,并且 C54X 和主机都无法读取。当主机将 1 写到该比特位时,将产生一个中断到 C54X。如果 IMR 寄存器中的 HPINT 位(D9)被设置为 1,DSP 将响应该中断,执行相应的中断服务程序。
给出dsp c5416和arm s3c2410的接线图
关于HPI引脚的定义不再介绍,自己参考手册吧
由于初始化时把HPIC的BOB置为0,所以HBIL(A1)引脚为低时送的是高字节
其顺序必须是HBIL先低后高,所以必须先送高字节后送低字节。
通过此图可以计算Hpi的端口地址
HPIC_WriteH = hpi_vbase+0x00
HPIC_WriteL = hpi_vbase+0x02
HPIC_ReadH = hpi_vbase+0x10
HPIC_ReadL = hpi_vbase+0x12
HPIA_WriteH = hpi_vbase+0x04
HPIA_WriteL = hpi_vbase+0x06
HPIA_ReadH = hpi_vbase+0x14
HPIA_ReadL = hpi_vbase+0x16
HPID_AutoWriteH = hpi_vbase+0x08
HPID_AutoWriteL = hpi_vbase+0x0a
HPID_AutoReadH = hpi_vbase+0x18
HPID_AutoReadL = hpi_vbase+0x1a
HPID_WriteH = hpi_vbase+0x0c
HPID_WriteL = hpi_vbase+0x0e
HPID_ReadH = hpi_vbase+0x1c
HPID_ReadL = hpi_vbase+0x1e
理解了原理再写驱动就比较方便了
首先要设置HPIC,然后给HPIA写一个地址,接着就可以通过HPID读写数据了。
有地址自增和不自增两种方式,其地址是不一样的。
注意: 自增读时,先读后自增
自增写时,先自增后写 所以写的时候要注意地址
嘿嘿,要看源代码,到下一章去吧。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮