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司机

问题描述:

码,然后用问题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); 

因为它是一个物理地址。但它不会打印在您的输出中。 检查您正在访问的设备是否已计时。

+0

物理地址确实是静态的,所以定义不能通过内核版本进行更改。打印的地址是动态ioremap地址,所以它根据我运行的内核版本而变化。不知道为什么,至于为什么,我已经在每个内核中尝试了关联和关闭的时钟,并且它在工作版本上没有区别,如果它在工作或不工作,仍然有效。在破碎的版本中它仍然是破碎的。这并不排除时钟imo,无论是版本可能是他们做错了什么,只是没有关于这个MBX芯片的任何信息感谢您的想法! – Chris

+0

我在这里错了,其他人在测试之前重新启用了时钟。工作内核需要设备工作的时钟。 – Chris