打印

ARM+DSP双核HPI接口驱动设计

[复制链接]
2991|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
五谷道场|  楼主 | 2011-11-18 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ARM外部I/OHPI硬件连接
  S3C2410TMS320C6416硬件接口如图1所示, S3C2410的两根地址线ADDR[3:2]HPI口的HCNTL[1:0],以实现ARMHPI3个寄存器的访问。S3C2410ADDR4代替读写选通信号连接HPI口的HR/WS3C2410片选信号nGCS1接到HPI片选HCS上,将DSPHPI接口作为外部物理地址映射到S3C2410相应的内核空间,位于外部I/O接口BANK1地址0x08000000~0x0FFFFFFF
 HPI接口设备驱动程序软件设计

相关帖子

沙发
五谷道场|  楼主 | 2011-11-18 09:33 | 只看该作者
1 linux设备驱动程序

  Linux设备类型分为三种:字符设备,块设备和网络设备。本设计将HPI外设归类于字符设备。在系统内部,字符设备驱动程序都提供类似文件操作的open,close,read,write,ioctl等函数入口,详见中的file_operations数据结构。初始化字符设备时,设备驱动程序向linux登记,并在字符设备向量表中增加一个device_struct数据结构条目,这个设备的主设备表示符用做这个向量表的索引。HPI设备驱动程序在内核与用户空间注册注销及系统调用过程如图2所示:

使用特权

评论回复
板凳
五谷道场|  楼主 | 2011-11-18 09:34 | 只看该作者

使用特权

评论回复
地板
五谷道场|  楼主 | 2011-11-18 09:35 | 只看该作者
2 HPI设备驱动程序设计
  2.1 HPI接口设备数据结构及其文件系统接口定义
  HPI接口设备数据结构是自定义的,它完成各个不同系统调用之间的协调工作,因此在设备驱动中是全局数据结构变量。具体定义如下:
Struct HPI_DEVICE{
  devfs_handle_t devfs ;     //devfs device
  char isopen ;         //device status: 1=opened, 0=closed
  int MajorID ;         
  kdev_t MinorID ;
  U16 DriverType ;
  char *HpiBaseBufRead ;
char * HpiBaseBufWrite ;
  wait_queue_head_t rd_wait ;   //read timeouts
  struct semaphore sem ;      //lock to prevent concurrent reads or writes
  #if defined(DMA_SUPPORT)   //DMA
    DMA_CHANNEL_INFO DmaInfo[NUMBER_OF_DMA_CHANNELS];
   Spinlock_t LockDmaChannel ;
  #endif
  struct file_operations hpi_fops ;
  }

  文件系统接口定义是用户使用HPI设备的接口,合理定义设备驱动程序在内核中的源码就能简化应用程序的设计。
Static struct file_operations hpi_fops={
owner : THIS_MODULE ,
open :  hpi_open ,
read :  hpi_read ,
write :  hpi_write ,
ioctl :  hpi_ioctl ,
mmap :  hpi_mmap ,
release : hpi_release ,
};

  2.2 读取HPI接口数据
  HPI设备驱动程序的开发大多数工作都集中在struct file_operations中接口函数的编写上,这些函数是应用程序通过内核操作硬件设备的入口函数,下面将给出对HPI接口读数据的关键代码。
#define HPI_BASEADDR     0x08000000   //   BANK 1
#define bHPI(Nb)         __REG1(HPI_BASEADDR +(Nb))
#define HPIC_WRITE       bHPI(0x0)
#define HPIC_READ       bHPI(0x40)
#define HPIA_WRITE       bHPI(0x10)
#define HPIA_READ       bHPI(0x50)
#define HPID_WRITE       bHPI(0x20)
#define HPID_READ       bHPI(0x60)
Static ssize_t hpi_read(struct file *file,char *buf,size_t count,loff_t *oppos)
{
Struct HPI_DEVICE *pHpiDevice ;
   int i , hpi_size ;
   size_t ret ;
   down(&(pHpiDevice->sem));
   hpi_size = 1024;
   for(i=0;i
   { HPIC_WRITE = 0x00000000 ;    //初始化HPI控制寄存器
     HPIA_WRITE = 0x80000000 ;    //初始化HPI地址寄存器,读取DSP地址为0x80000000的数据
      (__U8*)(&pHpiDevice-> HpiBaseBufRead) = HPID_READ ; //读取1k到HpiBaseBufRead缓冲区
    }
    IBUF_SIZE = hpi_size ;
  ret=copy_to_user(buf,(__U8*)(&pHpiDevice->HpiBaseBufRead),IBUF_SIZE)?-EFAULT : ret ;
    up(&(pHpiDevice->sem));
    return IBUF_SIZE ;
}

使用特权

评论回复
5
虎虎生威| | 2011-11-18 09:47 | 只看该作者
这个驱动好像并不难啊,怎么没有写驱动呢?

使用特权

评论回复
6
五谷道场|  楼主 | 2011-11-20 10:46 | 只看该作者
对,没有想象中的那么难,写驱动跟读驱动差不多。

使用特权

评论回复
7
sky_假装| | 2011-12-25 21:40 | 只看该作者
6# 五谷道场


  请教一下,这个内存映射,数据手册上面好像找到的只有一个寄存器的偏移地址,是怎么算出来其他的地址的呢?
#define HPI_BASEADDR     0x08000000   //   BANK 1
#define bHPI(Nb)         __REG1(HPI_BASEADDR +(Nb))
#define HPIC_WRITE       bHPI(0x0)
#define HPIC_READ       bHPI(0x40)
#define HPIA_WRITE       bHPI(0x10)
#define HPIA_READ       bHPI(0x50)
#define HPID_WRITE       bHPI(0x20)
#define HPID_READ       bHPI(0x60)

使用特权

评论回复
8
blacksword| | 2011-12-27 11:00 | 只看该作者
这样一个复杂的东东,不就是构成了一个OMAPL138吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7647

主题

9805

帖子

11

粉丝