ARM+DSP双核HPI接口驱动设计[原创]

 

硬件连接设计                     

 

 ARM外部I/OHPI硬件连接

   S 3C 2410TMS 320C 6416硬件接口如图1所示, S 3C 2410的两根地址线ADDR[3:2]HPI口的HCNTL[1:0],以实现ARMHPI3个寄存器的访问。S 3C 2410ADDR4代替读写选通信号连接HPI口的HR/WS 3C 2410片选信号nGCS1接到HPI片选HCS上,将DSPHPI接口作为外部物理地址映射到S 3C 2410相应的内核空间,位于外部I/O接口BANK1地址0x08000000~0x0FFFFFFF

                             图 1 

HPI接口设备驱动程序软件设计

1 linux设备驱动程序

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

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<hpi_size;i++)

       {  HPIC_WRITE = 0x00000000 ;         //初始化HPI控制寄存器

          HPIA_WRITE = 0x80000000 ;         //初始化HPI地址寄存器,读取DSP地址为0x80000000的数据

            (__U8*)(&pHpiDevice-> HpiBaseBufRead[i]) = HPID_READ ;   //读取1kHpiBaseBufRead缓冲区

         }

        IBUF_SIZE = hpi_size ;

     ret=copy_to_user(buf,(__U8*)(&pHpiDevice->HpiBaseBufRead),IBUF_SIZE)?-EFAULT : ret ;

        up(&(pHpiDevice->sem));

        return IBUF_SIZE ;

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值