DSP

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   高位地址只是从03有效 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)被设置为 1DSP 将响应该中断,执行相应的中断服务程序。   给出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读写数据了。 有地址自增和不自增两种方式,其地址是不一样的。 注意:    自增读时,先读后自增              自增写时,先自增后写           所以写的时候要注意地址 嘿嘿,要看源代码,到下一章去吧。