3 智能无线点播的实现
微处理器S3C2440A和无线芯片CYWUSB6934之间通过SPI接口进行通信,在Linux系统中两者之间的通信就必须通过SPI驱动程序来实现。而智能点播则是在用户启动Linux系统中的点播程序时,系统识别接收到的数据后,自动调用音视频文件进行播放。
3.1 SPI驱动
在Linux操作系统中,所有外围设备的控制都是通过驱动程序实现的,设备驱动程序是操作系统内核与机器硬件之间的接口。
SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为
PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。手持智能无线多媒体终端需要通过SPI接口控制无线收发芯片,这就需使用SPI接口驱动程序来建立无线收发芯片与内核之间的通信桥梁。SPI接口以主从方式进行工作,其接口包括4种信号:(1)MOSI:主器件数据输出,从器件数据输入;(2)MISO:主器件数据输入,从器件数据输出;(3)SCLK:时钟信号,由主器件产生;(4)/SS:从器件使能信号,由主器件控制。
图2为S3C2440A与CYWUSB6934之间SPI接口的连接图。图中nSS控制CYWUSB6934作为从器件,SPIMOSI和SPIMISO是它们之间的数据传输通道,SPICLK为时钟信号。当SPI作为主控制器时,由SPPRE寄存器中相应的比特位控制。而当SPI为从设备时,时钟信号则是由其他设备提供。某些情况下,在将数据写入SPTDAT寄存器之前,nSS应该被置为高电平。在本系统中主要用到的S3C2440A内部与SPI相关的寄存器如下:
(1)SPCON寄存器:主要用于设置时钟开启、SPI传输格式、SPI传输模式。其中传输模式有3种,分别是polling模式、DMA模式、中断模式。
(2)SPSTA寄存器:SPI接口的状态寄存器,用于指示数据接收或发送是否已经完成。
(3)SPPIN寄存器:用于检测是否有多个主机。
(4)SPPRE寄存器:用于设置SPI传输时钟频率。其值通过如下计算式确定:
Baud rate=PCLK/2/(Prescaler value+1)
其中Prescaler value的初始值为0x00。
(5)SPTDAT和SPRDAT寄存器:发射和接收数据寄存器。
在Linux系统启动时,要对以上寄存器进行赋值,就必须通过SPI驱动程序。而驱动程序就是作为系统和外部设备的一个桥梁,在这里只有将SPI通道正确打开,系统才能够通过这个桥梁对外部无线芯片的基本工作寄存器进行操作,完成数据的收发。
Linux中的I/O子系统向内核中的其他部分提供了一个统一的标准设备接口,这是通过include/linux/fs.h中的数据结构file_operations完成的[11]。图3所示为本系统中SPI驱动设备描述符函数组成框图。
图3中驱动程序的struct file_operations( )只使用了系统提供的4个子函数接口:open( )、write( )、ioctl( )和release( )。其中open( )用于完成SPI设备的打开、初始化相关寄存器、准备进行设备I/O操作;write( )完成通过SPI接口进行写操作;ioctl( )是进行读写以外的其他操作,通过对I/O口高低电平的改变实现不同功能;release( )用于关闭设备,释放占用内存[12]。
S3C2440A SPI的传输形式是由SPI控制寄存器SPCON中的1 bit位和2 bit位的值共同决定的。1 bit位是CPHA(Clock Phrase Select),它用来选择传输格式为Format A或Format B,置0为Format A,置1为Format B;2 bit位是CPOL(Clock Polarity),它决定时钟信号是高电平触发还是低电平触发,置0为active high,置1为active low。由图3可以看出,CYWUSB6934的SPI单字节读出时钟是高电平触发的,又如虚线箭头处时钟信号的上升沿正与图4中SPI时钟相吻合,而在图4中cmd的2 bit位是传输字节中的最高2位,再根据图5中 MOSI的MSB就应该是传输字节的最高2位,为00,所以选择方式为Format A高电平触发。
在确定了它们之间的传输格式以及触发方式后, SPI驱动的实现就是对这些寄存器进行正确的赋值。无线收发芯片CYWUSB6934通过SPI接口与ARM9主控芯片进行通信,需要对各个寄存器进行设置。根据系统要求,使用SPI1口实现SPI通信,其具体的编程实现如下:
(1)在open( )函数中,对SPI接口进行初始化,设置端口使用状态,设置SPI传输时钟和传输模式。其代码如下:
在对S3C2440A中的SPI相关寄存器进行初始化时,需要注意SPI的时钟是与主时钟相关联的,如果不首先开启主时钟,即使将SPI自身工作时钟开启也不能使接口正常工作。
(2)通过写函数write( )实现对无线收发芯片CYWUSB6934的数据及地址寄存器的操作。其代码如下:
static ssize_t spi_write(struct file*filp,const char*buf,size_t
count,loff_t*f_ops)
{
unsigned int tmp=0;
get_user(tmp,(char*)buf);/*获取CYWUSB6934中寄存器地址*/
while((readl(SPSTA1) & 0x1)==0);
writel(tmp,SPTDAT1);/*向寄存器中写预置数据*/
while((readl(SPSTA1) & 0x1)==0);
tmp=readl(SPRDAT1);/*再次从读出的数据才是有用数据*/
put_user(tmp,(char*)buf);
return 0;
}
(3)驱动中的ioctl( )函数通过改变I/O输出电平的高低控制CYWUSB6934的PD(Power Down)口。该端口电平为低时可以使无线芯片工作在休眠状态,以达到省电的目的。其代码如下:
3.2 智能点播界面
当手持智能无线多媒体终端接收到由地址码无线发射机发出的地址码时,将其存储在数据寄存器中,主控芯片通过SPI接口读取该地址码信息,并以此为指针搜索对应的、预存在SD存储卡中的音视频文件,并按需调用终端中的音视频播放器解码播放。
软件界面有2个按钮,左边是自动播放按钮,右边是手动播放按钮。在用户启动点播软件时,终端处于自动播放状态,而自动播放按钮是当用户进行手动播放后,如需要再让其进行自动播放时使用此按钮。当用户点下手动播放按钮时,会立即终止自动播放,弹出文件选择菜单,手动选择需要播放的文件。
智能点播软件需要解决的是底层数据和上层应用程序的连接问题。而对地址码的判断是对底层进行操作,需调用C程序,则用户界面程序使用一个自定义的data外部变量,作为上层界面程序与底层应用程序的桥梁。为了使程序能准确地调用播放器,这里还设立了一个消息机制,定时查询CYWUSB6934的数据寄存器。一旦收到数据,就改变消息参数,上层界面程序查询到这个参数改变后,便立即调用播放器。
本文设计的基于嵌入式的无线智能多媒体数字播放系统将嵌入式应用技术与短距离无线通信技术相结合,构成一套既具有工程实用价值,又可按需扩展功能的系统,实现了智能化的区域识别与音视频播放,适用于各种景点及展台的音视频自动/手动受控播放,有很好的市场前景,能给厂商带来很大的利润。