开发者

linux driver, port 2.6.19.2 - 2.6.38-rc2 ARM11 iMX31, amba MBX device LogicPD Litekit GLES driver

开发者 https://www.devze.com 2023-02-07 08:36 出处:网络
Code followed with question #define MBX_REG_SYS_PHYS_BASE0xC0000000 #define MBX_REG_RANGE0x00004000 static struct resource mxc_reg_resources[] = {

Code followed with question

#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);

This code works on iMX31 from LogicPD using 2.6.19.2 with out of tree patching from freescale.

when porting it to 2.6.38-rc2 it no longer works. here are some data results:

Working results:

Address: 0xC7860000 MBX1_GLOBREG_REVISION: 0x01010200

Failed results:开发者_如何学C

Address: 0xC48A0000 MBX1_GLOBREG_REVISION: 0x00000000

Address: 0xC48A8000 MBX1_GLOBREG_REVISION: 0x00000000

Address: 0xC48B8000 MBX1_GLOBREG_REVISION: 0x00000000

Address: 0xC48C0000 MBX1_GLOBREG_REVISION: 0x00000000

maybe interesting is on 2.6.19.2 it always gets the same address mapped yet in 2.6.38-rc2 it does not.


Are you sure your defines are still good ? The output for this line should not change :

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

Since it is a physical address. However it is not printed in your output. Check the pripheral you are accessing is clocked.


In order to have this device ready to communicate you need to setup the peripheral port remap register

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

here is the code from the original 2.6.19.2 kernel, executed from a board fixup routine. and of course the clocks would have to be enabled as well, and this driver example is not showing that either.

0

精彩评论

暂无评论...
验证码 换一张
取 消