драйвер linux, порт 2.6.19.2 - 2.6.38-rc2 ARM11 iMX31, устройство amba MBX драйвер LogicPD Litekit GLES - PullRequest
1 голос
/ 31 января 2011

Код с вопросом

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

Этот код работает на iMX31 из LogicPD с использованием 2.6.19.2 с исправлением вне дерева из 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 голосов
/ 13 февраля 2011

Для того, чтобы это устройство было готово к связи, вам необходимо настроить регистр переназначения периферийного порта

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

вот код из исходного ядра 2.6.19.2, выполненный из процедуры исправления платы. и, конечно, часы также должны быть включены, и этот пример драйвера также не показывает это.

0 голосов
/ 31 января 2011

Вы уверены, что ваши определения все еще хороши? Выход для этой строки не должен изменяться:

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

Так как это физический адрес. Однако это не напечатано в вашем выводе. Проверьте, что первичное устройство, к которому вы обращаетесь, работает.

...