代码后面有疑问
#define MBX_REG_SYS_PHYS_BASE 0xC0000000
#define MBX_REG_RANGE 0x00004000
static struct resource mxc_reg_resources[] = {
{
.start = MBX_REG_SYS_PHYS_BASE,
.end = MBX_REG_SYS_PHYS_BASE + MBX_REG_RANGE - 1,
.flags = IORESOURCE_MEM }
};
mbx_reg = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mbx_reg)
return -EINVAL;
reg_base = ioremap(mbx_reg->start, resource_size(mbx_reg));
if (!reg_base) {
ret = -ENOMEM;
goto eremap;
}
printk(KERN_CRIT "Address: from 0x%08X to 0x%08X\n",
mbx_reg->start, reg_base);
regread = mx3reg_read_reg(mx3reg, MBX1_GLOBREG_REVISION);
printk(KERN_CRIT "MBX1_GLOBREG_REVISION: 0x%.8X\n", regread);此代码使用2.6.19.2对来自iMX31的LogicPD进行工作,而不使用freescale的树外修补。
当将它移植到2.6.38-rc2时,它不再工作了。以下是一些数据结果:
工作成果:
地址: 0xC7860000 MBX1_GLOBREG_REVISION: 0x01010200
失败的结果:
地址: 0xC48A0000 MBX1_GLOBREG_REVISION: 0x00000000
地址: 0xC48A8000 MBX1_GLOBREG_REVISION: 0x00000000
地址: 0xC48B8000 MBX1_GLOBREG_REVISION: 0x00000000
地址: 0xC48C0000 MBX1_GLOBREG_REVISION: 0x00000000
也许有趣的是在2.6.19.2,它总是得到相同的地址,但在2.6.38-rc2中却没有。
发布于 2011-02-13 07:34:16
为了使这个设备可以通信,您需要设置外围端口重新映射寄存器。
/* Setup Peripheral Port Remap register for AVIC */
asm("ldr r0, =0xC0000015 \n\
mcr p15, 0, r0, c15, c2, 4");下面是来自最初2.6.19.2内核的代码,它是从板修复例程中执行的。当然,时钟也必须启用,而这个驱动程序的例子也没有显示出这一点。
发布于 2011-01-31 09:14:54
你确定你的定义还不错吗?此行的输出不应更改:
printk(KERN_CRIT "Address: from 0x%08X to 0x%08X\n",
mbx_reg->start, reg_base);因为这是个物理地址。然而,它没有打印在您的输出。检查您正在访问的原始数据是否已被锁定。
https://stackoverflow.com/questions/4846538
复制相似问题