Драйвер ядра, ioremap необходим в системе без MMU?

Итак, я новичок, когда дело доходит до драйверов ядра и у меня есть вопрос, касающийся функции ioremap.

Я пишу драйвер для доступа к некоторым регистрам, определенным в пользовательском VHDL-модуле на SoC с матрицей ARM Cortex-M3 и FPGA. Глядя на примеры, которые я решил, я должен использовать ioremap, но поскольку Cortex-M3 не имеет MMU, я не вижу смысла, как в следующем примере:

/* Physical addresses */
static u32* rcu_trig_recv_physaddr = ((u32 *) 0x50040000);
static int  rcu_trig_recv_size     = 0x10; // size of 16 for testing 
/* Virtual addresses */
static u32* rcu_trig_recv_virtbase = NULL;
/*removed code not relevant for the question*/
static int __init rcumodule_init(void)
{
    int iResult = 0; // holding result of operations
    u32 buffer;     

    // Register the driver
    iResult = register_chrdev(rcuc_majorID, "rcuc", &rcuc_fops);
    if (iResult < 0) {
        printk(KERN_INFO "module init: can't register driver\n");
    }
    else{
        printk(KERN_INFO "module init: success!\n");
    }

    // Map physical address to virtual address
    if(rcu_trig_recv_size){
        rcu_trig_recv_virtbase = (u32*) ioremap_nocache( (u32 *)rcu_trig_recv_physaddr, rcu_trig_recv_size );
        printk("Remapped TRGRECV from 0x%p to 0x%p\n", rcu_trig_recv_physaddr, rcu_trig_recv_virtbase);
    }
    // try to read some stuff, expecting 0x17240f09  
    buffer = readl(rcu_trig_recv_virtbase);
    printk("read %lx, at 0x%p\n", buffer, rcu_trig_recv_virtbase);

    return iResult;
}

Это затем вернуть, когда я insmod драйвер:

# insmod trigger.ko 
module init: success!
Remapped TRGRECV from 0x50040000 to 0x50040000
read 17240f09, at 0x50040000

В соответствии с этим, мне было бы лучше вместо чтения физического адреса. Или это плохая идея, и я должен лучше поиграть со своими регистрами?

1 ответ

Решение

Вполне возможно, что вам это сойдет с рук, если вы знаете, что ваш код никогда не понадобится использовать на другом устройстве, но вы гораздо безопаснее придерживаться ioremap(). Использование вашего кода для получения и использования указателей, предоставляемых IO с отображением в памяти, сделает ваш код более переносимым и обслуживаемым, чем использование жестко закодированных физических адресов.

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

Другие вопросы по тегам