отображение области памяти из ядра - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть регистр, к которому нужно обращаться более чем из одного драйвера.Это глобальный регистр только для чтения, который находится в пространстве ПЛИС. Адрес регистра экспортируется через дерево устройств.Первый вызов «request_mem_region» в порядке, но любой последовательный вызов не выполняется.

Есть ли способ разделить регистр между драйверами?

Релиз Linux Kernel - 4.14 с использованием petalinux

Спасибо, Ран

1 Ответ

0 голосов
/ 26 ноября 2018

Вам нужно переназначить область памяти чем-то вроде ioremap () после того, как вы ее запросили.

Затем, как упоминали Цыварев и другие, создайте и экспортируйте функцию в свой «родительский» драйвер, который возвращаетmapped memory.

Вот примерный код:

void * mapped_mem;

void * map_addr(unsigned int phy_addr, char * name) {

    struct resource * resource;
    void * mapped_mem;

    resource = request_mem_region(phy_addr, page_size * 4, name);
    // check for errors

    mapped_mem= ioremap_nocache(phy_addr, page_size * 4);
    // check for errors
    return mappedMem;

    //handle errors
}


void * get_mapped_addr(void) {
    return mapped_mem
}

EXPORT_SYMBOL( get_mapped_addr);

Теперь mapped_mem должен отслеживаться как часть личной информации вашего устройства, но я думаю, что это выходит за рамки вопроса.Также не забудьте проверить все возможные ошибки.Убедитесь, что request_mem_region () возвращает что-то> 0, а не Null.

...