当前位置: 技术问答>linux和unix
USB驱动 OHCI寄存器 ioremap地址映射
来源: 互联网 发布时间:2016-07-03
本文导语: 最近在搞USB驱动,遇到这样的问题: 为了访问OHCI寄存器,所以利用ioremap进行地址映射。于是,OHCI寄存器的物理地址0x74300000映射为虚拟地址0xC6400000,根据该虚拟基地址,读写OHCI的寄存器,发现刚写下去的值,立刻...
最近在搞USB驱动,遇到这样的问题:
为了访问OHCI寄存器,所以利用ioremap进行地址映射。于是,OHCI寄存器的物理地址0x74300000映射为虚拟地址0xC6400000,根据该虚拟基地址,读写OHCI的寄存器,发现刚写下去的值,立刻读出来居然全部都是0,也就是根据映射后的虚拟地址读写寄存器错误。
检查时钟有关的寄存器,发现应该是没有问题的,寄存器内容如下(S3C6410芯片):
四个主要的寄存器:
CLKSRC 0x542007
CLKDIV1 0x0
HCLKGATE 0xffffffff
SCLKGATE 0xffffffff
这到底是什么问题啊?ioremap后的虚拟地址不能直接访问OHCI的物理寄存器吗?如果可以,可是为什么访问结果不对呢?
为了访问OHCI寄存器,所以利用ioremap进行地址映射。于是,OHCI寄存器的物理地址0x74300000映射为虚拟地址0xC6400000,根据该虚拟基地址,读写OHCI的寄存器,发现刚写下去的值,立刻读出来居然全部都是0,也就是根据映射后的虚拟地址读写寄存器错误。
检查时钟有关的寄存器,发现应该是没有问题的,寄存器内容如下(S3C6410芯片):
四个主要的寄存器:
CLKSRC 0x542007
CLKDIV1 0x0
HCLKGATE 0xffffffff
SCLKGATE 0xffffffff
这到底是什么问题啊?ioremap后的虚拟地址不能直接访问OHCI的物理寄存器吗?如果可以,可是为什么访问结果不对呢?
|
upupup!
|
某些寄存器的各位的状态分别代表各个功能的,某些功能是可以写,某些功能是只读的。这个你在datasheet要看清楚。
另外你可以在写之前先读出来看看该寄存器的内容是什么,写的时候换多几个值试试看。
另外你可以在写之前先读出来看看该寄存器的内容是什么,写的时候换多几个值试试看。
|
首先看看 datasheet, OHCI寄存器是否可以读写,有可能是寄存器的某些位只读,某些位可写。
然后看看你在ioremap调用是否返回成功。
0xC5B00000地址如果没有被用到的话,不能访问是正确的。
可以到 LinuxSRC/include/asm/arch 里面的某个头文件找找,一般板子上的那些寄存器的物理地址映射到linux上的虚拟地址都已经定义好的了。
然后看看你在ioremap调用是否返回成功。
0xC5B00000地址如果没有被用到的话,不能访问是正确的。
可以到 LinuxSRC/include/asm/arch 里面的某个头文件找找,一般板子上的那些寄存器的物理地址映射到linux上的虚拟地址都已经定义好的了。
|
你的arch里没有直接把所有的IO区域都映射到内核虚拟内存里去吗?
如果usb设计成一块Memory io,是可以这样做的,至于为什么是0, 请高手上前。。
如果usb设计成一块Memory io,是可以这样做的,至于为什么是0, 请高手上前。。