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

Linux kernel linux驱动程序,端口2.6.19.2-2.6.38-rc2 ARM11 iMX31,amba MBX设备LogicPD Litekit驱动程序,linux-kernel,arm,linux-device-driver,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_RA

代码后面跟着问题

#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上运行

将其移植到2.6.38-rc2时,它将不再工作。 以下是一些数据结果:

工作成果:

地址:0xC7860000 MBX1_GLOBREG_版本:0x01010200

失败的结果:

地址:0xC48A0000 MBX1_GLOBREG_版本:0x00000000

地址:0xC48A8000 MBX1_GLOBREG_版本:0x00000000

地址:0xC48B8000 MBX1_GLOBREG_版本:0x00000000

地址:0xC48C0000 MBX1_GLOBREG_版本:0x00000000

可能有趣的是在2.6.19.2上,它总是得到相同的地址映射
然而,在2.6.38-rc2中,情况并非如此

你确定你的定义还是好的吗?此行的输出不应更改:

printk(KERN_CRIT "Address: from 0x%08X to 0x%08X\n",
                         mbx_reg->start, reg_base);
因为它是一个物理地址。但是,它不会打印在输出中。
检查您正在访问的主端口是否已计时。

为了使该设备准备好通信,您需要设置外围端口重新映射寄存器

/* Setup Peripheral Port Remap register for AVIC */
       asm("ldr r0, =0xC0000015                                \n\
        mcr p15, 0, r0, c15, c2, 4");
下面是原始2.6.19.2内核中的代码,从一个板修复例程执行。
当然,时钟也必须启用,这个驱动程序示例也没有显示这一点。

物理地址确实是静态的,因此定义不能随内核版本而改变。打印的地址是动态ioremap地址,因此它会根据我运行的内核版本进行更改。不知道为什么,至于时钟,我已经在每个内核中尝试了相关的时钟开和关,它对工作版本没有影响,如果它开或不开,仍然工作。在破损的版本中,它仍然破损。这并不排除imo的时钟,任何一个版本都可能是做错了或者其他什么,只是没有关于这个MBX芯片的任何信息,谢谢你的想法!我错了,其他人在我考试前重新启用了时钟。工作的内核需要时钟,设备才能工作。