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

关于ioremap的硬件访问与s2c2410的板级支持包
刚开始接触驱动 想打算自己从头写一个关于s3c2440的led的程序 对led寄存器进行访问的时候 我用到了ioremap函数
程序:base = ioremap(0x56000000,12); //将物理地址转化为虚拟地址
  iowrite8(0xff,base); //写入控制寄存器
  iowrite8(0x00,base+0x08); //写入使能寄存器(GPFUP)
insmod 加载内核后没有出现问题
但是lsmod的时候 出现错误提示 unable to handle kernel paging request at virtual address 7427636d (还有一堆指针寄存器数据 我觉得关键是这一句) 实在不知道是什么错误 为什么是在7427636d 跟ioremap有关系么?
1 是我内存请求错误?
2 还是说此地址已经被映射过?第二次映射就会出错(我搜索了有关信息,即使是多次ioremap得到的不同的虚拟地址都可以正确映射物理地址)


还有就是原程序是用板级支持包里附带的函数(s3c2410_gpio_getpin)来对引脚进行读写的 我逐一进入此函数以及相关函数 发现根本没有ioremap的影子 只是单纯的赋值 最后得出来的虚拟地址 比如:#define S3C24XX_VA_GPIO ((S3C24XX_PA_GPIO - S3C24XX_PA_UART) + S3C24XX_VA_UART)
难道对于ARM来说 IO内存的访问 虚拟地址和物理地址之间的差是一定的?

不知道我有没有讲明白我的问题.....还往各位指点!!

------解决方案--------------------
申请端口空间之前要调用request_mem_region申请资源,申请成功才能进行映射
------解决方案--------------------
同意楼上!还有不一定是这儿原因,在驱动中多添加printk,看看驱动哪儿出错了。printk才是最强悍的内核调试工具!
------解决方案--------------------
地址映射错误。。。