网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> C6000文章 >> C64X系列 >> 文章正文
  [组图]ARM+DSP双核HPI接口驱动设计         ★★★ 【字体:
ARM+DSP双核HPI接口驱动设计
作者:互联网    文章来源:本站原创    点击数:    更新时间:2007-1-23    

硬件连接设计                     

 

 

 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上。

 

 

                             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 ;

 

}

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    基于ARM+DSP的小型地面移动机…
    基于ARM+DSP的小型地面移动机…
    基于DSP的电子节气门PID控制
    基于DSP的多路音/视频采集处…
    低功耗实时可编程DSP数字助听…
    基于DSP+CPLD的断路器智能控…
    基于DSP+CPLD的交流电机调速…
    基于DSP的分布式微机保护测控…
    基于DSP的语音实时变速系统设…
    以ARM和DSP嵌入式系统为核心…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号