今天成功移植mini6410 Linux2.6.38内核的jpeg硬解码。 记录一下,这对我来说是像硬解码跨越的第一步,或许我不能做成mini6410那样的强大,但是我希望能对硬解码的部分有一个了解和认识。
移植我认为分为三部:
1: 平台设备的添加。
2: 平台驱动的添加,同时生成设备文件。
3: 测试程序。
1: 平台设备的添加
mach-mini6410中添加s3c_device_jpeg平台设备。
2: 平台驱动的添加。
拷贝三星原厂资料中 jpeg_drv文件夹下面的全部内容,编译
1): 修改Makefile中的编译路径和内核所在的目录。编译
2): 修正错误。
总结下错误,错误大概为集中为以下几点:
1: ioctl函数的原型不对,2.6.38的内核原型为static long s3c_jpeg_ioctl(struct file *file, unsigned int cmd, unsigned long arg)。
2: JPG_DATA_BASE_ADDR找不到定义的文件。
3: S3C_VA_SYS没有找到定义。
4: 一些头文件找不到。
解决方法:
1: 修改ioctl的原型,内在内容不需要修改。
2: 在内核中增加以下两步
1): 添加media.h
2): 添加bootmem.c,dev-video.c,并导出bootmem.c里面的接口函数。
3:在Map-base.h中增加S3C_VA_SYS的定在。
4:更换对应的头文件的路径。
在此对底层驱动的各个文件进行以下说明,希望对移植的人有帮组,请参看备注1.
3: 拷贝jpeg_app文件下面的文件。
1: 修改Makefile中的gcc的路径,然后进行编译。
2: 注意以下驱动中ioctl中的命令是否和上层的命令一致。
在此对底层驱动的各个文件进行以下说明,希望对移植的人有帮组,请参看备注2.
备注:
1: 以下是驱动文件的分析
1): S3c-jpeg.c文件。
1:文件功能大致为注册平台驱动->调用Prob函数->注册混杂设备。
2:上层通过混杂设备中的ioctl命令访问底层。操作之前必须先打开。
2): JPGMem.c文件。
顾明思议,内存分配调用函数。
1: 分配底层访问结构体。
2: 拷贝数据给用户程序。拷贝用户数据到底层驱动。
3): JPGMisc.C
1: 保证任何时候只有一个进程在操作底层API。 采用互斥来实现。
4): JPGOpr.c
1: 主要完成编解码的所有的功能。
2: 按照操作手册完成编解码。
5): LogMsg.c
1: 打印信息。
2: 以下是对应用层文件夹的说明。
1: fname_enc.txt 编码文件,表明需要编码的文件。
2: fname_dec.txt 解码文件,表明需要解码的文件。
3: JPGApi.c 提供上层API函数,也就是说明文档中的API函数,供上层test文件调用。也就友善之臂中JPEG解码中的硬解码的函数。
4: performance.c 计算FPS文件。
5: test.c 测试函数
最后言语:当然移植可能远没有我说这么简单,只要你能静下心来看官方手册,能静下心来研究源码,其实移植也挺快的。 本想直接上源码的,可是发现这次移植内部有一些改动,所以也就不发布源码了,祝大家成功。