当前位置: 技术问答>linux和unix
关于ioremap的硬件访问与s2c2410的板级支持包
来源: 互联网 发布时间:2017-03-02
本文导语: 刚开始接触驱动 想打算自己从头写一个关于s3c2440的led的程序 对led寄存器进行访问的时候 我用到了ioremap函数 程序:base = ioremap(0x56000000,12); //将物理地址转化为虚拟地址 iowrite8(0xff,base); //写入控制寄存器 ...
刚开始接触驱动 想打算自己从头写一个关于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内存的访问 虚拟地址和物理地址之间的差是一定的?
不知道我有没有讲明白我的问题.....还往各位指点!!
程序: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才是最强悍的内核调试工具!
|
地址映射错误。。。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。