日期:2014-05-16  浏览次数:20638 次

linux2.6.36 JPEG驱动问题
我用的S3C6410自带的jpeg驱动在linux2.6.28下可以正常使用,但是换到linux2.6.36 下面,系统加载JPEG驱动的时候会报错:
S3C JPEG Driver, (c) 2007 Samsung Electronics
phy_addr = 78800000..mem_size = 1034
phy_addr = 569f9000..mem_size = 79e000
BUG: Your driver calls ioremap() on system memory. This leads
<4>to architecturally unpredictable behaviour on ARMv6+, and ioremap()
<4>will fail in the next kernel release. Please fix your driver.
请教各位大牛,这个问题如何解决?

------解决方案--------------------
phy_addr = 78800000..mem_size = 1034
phy_addr = 569f9000..mem_size = 79e000

78800000是对的,这是6410 JPEG的物理地址
569f9000不对劲 ,

你对比一下2个版本的打印
------解决方案--------------------
探讨

引用:
板子没换,只是内核换了么?
显然,你需要修改驱动,ioremap映射的物理地址到内核空间后有问题。
驱动有没有和新内核代码关联编译?试试把此驱动代码放到新内核里编译吧。
只是换了内核,编译应该是没有问题的

------解决方案--------------------
不是叫你改内核代码
你需要理解
phy_addr = 78800000..mem_size = 1034
phy_addr = 569f9000..mem_size = 79e000
这两个物理地址的含义
78800000 是一个固定的地址,是6410的JPEG的寄存器基址,对于所有6410的板子都一样
但是569f9000 或者52aec000 是什么就不知道了,这片地址属于自由配置的,可能属于ram,也可能属于nor flash
你需要看你自己板子的原理图,搞清楚这个物理地址属于你板子上的哪个设备,再搞清楚这个地址的用途

然后找到52aec000这个地址在你源码里定义的位置,修改2.6.36里的这个地址到52aec000 ,以及mem_size 也要改成一样

解决这个问题必须你自己心里清楚,你的板子你的源码只有你有
------解决方案--------------------
你改这个void __init s3c64xx_reserve_bootmem(void)肯定是不对的,其他人也会用到。

你要改的是jpeg解码驱动,jpeg解码的时候,会需要指定你的jpg数据放在哪儿,解完后放在哪里,这里应该会有个#define的定义,你去jpeg的驱动找找就行了。
但直接改为52aec000,我估计很悬,首先你得搞清楚你的内存布局,jpeg解码内存的位置。