![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| ARM+DSP双核HPI接口驱动设计 | |||||
作者:互联网 文章来源:本站原创 点击数: 更新时间:2007-1-23 ![]() |
|||||
|
硬件连接设计 ARM外部I/O与HPI硬件连接 S
图 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 ; //读取1k到HpiBaseBufRead缓冲区 } 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条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|