基于S3C2410的MPEG-4数字录像机的设计与实现

[10-10 20:38:44]   来源:http://www.88dzw.com  电子制作   阅读:8467

文章摘要:[3]。 采用类似IDE接口的方式将IME6400的HOST接口映射到处理器的第6个Memory Bank中。系统存储部分采用体积小、抗震性好、温度范围宽的电子硬盘作为存储器。3 软件设计由于Linux系统具有稳定、高效、易定制、易裁减、开放源码等优点,本系统选用嵌入式Linux作为操作系统,在此系统下实现IME6400驱动程序设计和相关应用程序设计。Linux 将设备当作文件处理,编写linux驱动程序的最主要工作就是file_operations结构中各入口点的实现,即对应于open()、release()、read()、write()、ioctrl()等系统调

基于S3C2410的MPEG-4数字录像机的设计与实现,标签:电子小制作,http://www.88dzw.com
[3]。

  

     采用类似IDE接口的方式将IME6400的HOST接口映射到处理器的第6个Memory Bank中。系统存储部分采用体积小、抗震性好、温度范围宽的电子硬盘作为存储器。

3        软件设计

由于Linux系统具有稳定、高效、易定制、易裁减、开放源码等优点,本系统选用嵌入式Linux作为操作系统,在此系统下实现IME6400驱动程序设计和相关应用程序设计。

Linux 将设备当作文件处理,编写linux驱动程序的最主要工作就是file_operations结构中各入口点的实现,即对应于open()、release()、read()、write()、ioctrl()等系统调用子函数的编写[4]。同时本系统的设备驱动程序采用灵活性较好的动态加载方式,驱动程序还应包括模块初始化函数和模块注销函数。下面介绍几个主要函数及其功能:

l         模块初始化函数在驱动程序被加载的时候被调用,主要完成以下功能:

申请挂载总线上的视频编码芯片的实际物理地址空间并且将它映射到虚拟地址空间:

       request_region(BASE_ADDR,0x100,"IME6400")

       vbase = ioremap_nocache(BASE_ADDR,0x100)           

注册设备并获取主设备号[4]

       ret=register_chrdev(IME6400_MAJOR,"ime6400",&ime6400_fops)

设置并且申请中断及注册中断处理函数:

       set_external_irq(IRQ_EINT19, EXT_FALLING_EDGE, GPIO_PULLUP_DIS) request_irq(IRQ_EINT19, &ime6400_irq, SA_INTERRUPT,"ime6400", NULL)

注册设备文件系统:

       ime6400_devfs_dir= devfs_register(NULL,"ime6400",DEVFS_FL_DEFAULT,IME6400_MAJOR,0, S_IFCHR |S_IRUSR |S_IWUSR |S_IRGRP |S_IWGRP,&ime6400_fops, NULL)

l         OPEN函数递增模块使用计数,防止没有释放设备就把模块卸载了。

l         READ函数阻塞等待数据缓冲区满,然后把数据从内核空间复制到用户空间。

l         IOCTRL函数实现从用户空间向内核空间传递参数,用于设置IME6400工作模式。

l         中断处理函数读取IME6400输出的MPEG-4码流数据存入内核缓冲区,并通知IME6400数据读取完毕。Linux将中断处理函数分为两部分:顶半部(top half)是实际响应中断的例程,底半部(bottom half)是一个被顶半部调用在稍后安全的时间内运行的例程[5]。Linux采用Tasklet机制实现底半部处理,通过宏DECLARE_TASKLET可以声明Tasklet:

static DECLARE_TASKLET(ime_tasklet,do_tasklet,NULL),其中do_tasklet函数实际处理中断,从IME6400读取数据至内核缓冲区。通过函数tasklet_schedule()可以调度一个Tasklet运行:tasklet_schedule(&ime_tasklet) 。

本系统应用程序主要实现从驱动层接收MPEG-4码流数据并存储至硬盘,主要采用多线程编程的方式,主程序创建了读和写线程两个线程:首先,用户程序读线程调用read(),此时编码尚未开始,驱动进行ime6400_read()无数据可读,进入睡眠态,用户进程被阻塞。此后中断到来,中断处理程序从IME6400读取数据存入内核缓冲区,若缓冲区满则唤醒睡眠的ime6400_read(),并往IME6400的USER4寄存器写入一个新值,通知IME6400数据已读取完毕,启动新一轮的编码。ime6400_read()被唤醒后,将内核缓冲区数据拷贝到用户缓冲区,然后返回并等待用户进程的下一次调用。ime6400_read()返回后,用户空间读到编码数据退出阻塞状态,然后读线程以信号量通知写线程,由写线程完成将缓冲区数据存储至硬盘。

上一页  [1] [2] [3]  下一页


Tag:电子制作电子小制作维修教程知识 - 电子制作

《基于S3C2410的MPEG-4数字录像机的设计与实现》相关文章