linux驱动,端口2.6.19.2 - 2.6.38-RC2 ARM11 iMX31,AMBA MBX设备LogicPD Litekit GLES司机
问题描述:
码,然后用问题linux驱动,端口2.6.19.2 - 2.6.38-RC2 ARM11 iMX31,AMBA MBX设备LogicPD Litekit GLES司机
#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带出来从飞思卡尔修补的树。
将其移植到2.6.38-rc2时,它不再起作用。 这里有一些数据结果:
工作结果:
地址:0xC7860000 MBX1_GLOBREG_REVISION:0x01010200
失败结果:
地址:0xC48A0000 MBX1_GLOBREG_REVISION:00000000
地址:0xC48A8000 MBX1_GLOBREG_REVISION:00000000
地址:0xC48B8000 MBX1_GLOBREG_REVISION:00000000
地址:0xC48C0000 MBX1_GLOBREG_REVISION:00000000
也许有趣的是2.6.19.2它总是得到相同的地址在2.6.38-rc2中映射为 ,但它没有。
答
为了有这个设备准备好通信你需要设置外设端口重映射注册
/* Setup Peripheral Port Remap register for AVIC */
asm("ldr r0, =0xC0000015 \n\
mcr p15, 0, r0, c15, c2, 4");
这里是从原来的2.6.19.2内核代码,从板修正程序中执行。 ,当然也必须启用时钟,并且此驱动程序示例也没有显示。
答
你确定你的定义仍然好吗?该行的输出不应该改变:
printk(KERN_CRIT "Address: from 0x%08X to 0x%08X\n",
mbx_reg->start, reg_base);
因为它是一个物理地址。但它不会打印在您的输出中。 检查您正在访问的设备是否已计时。
物理地址确实是静态的,所以定义不能通过内核版本进行更改。打印的地址是动态ioremap地址,所以它根据我运行的内核版本而变化。不知道为什么,至于为什么,我已经在每个内核中尝试了关联和关闭的时钟,并且它在工作版本上没有区别,如果它在工作或不工作,仍然有效。在破碎的版本中它仍然是破碎的。这并不排除时钟imo,无论是版本可能是他们做错了什么,只是没有关于这个MBX芯片的任何信息感谢您的想法! – Chris
我在这里错了,其他人在测试之前重新启用了时钟。工作内核需要设备工作的时钟。 – Chris