linux驱动程序,端口2.6.19.2 - 2.6.38-rc2 ARM11 iMX31,amba MBX设备LogicPD Litekit GLES驱动程序

时间:2011-01-31 00:14:43

标签: linux-kernel arm linux-device-driver

代码后跟问题

#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的LogicPD的iMX31,以及来自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中却没有。

2 个答案:

答案 0 :(得分:0)

你确定你的定义仍然很好吗?此行的输出不应更改:

printk(KERN_CRIT "Address: from 0x%08X to 0x%08X\n",
                         mbx_reg->start, reg_base);

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

答案 1 :(得分:0)

为了让此设备准备好进行通信,您需要设置外设端口重映射寄存器

/* Setup Peripheral Port Remap register for AVIC */
       asm("ldr r0, =0xC0000015                                \n\
        mcr p15, 0, r0, c15, c2, 4");

这是来自原始2.6.19.2内核的代码,从板修正例程执行。 当然也必须启用时钟,这个驱动程序示例也没有显示。