0

Я пытаюсь создать настраиваемый драйвер UART для малины PI. Я пытаюсь выполнить ioremap MMIO. Но ioremap всегда возвращается NULL.ioremap возвращает NULL

#define UART_REG_BASE_ADDR 0x7E20100 

pUart = ioremap(UART_REG_BASE_ADDR, 1024); 
if (pUart==NULL) 
{ 
    printk("Couldn't remap UART MMIO\n"); 
    return -EIO; 
} 

dmesg отвалы следующие:

[ 2906.579848] CPU: 0 PID: 4983 Comm: insmod Tainted: G  D W O 3.18.5+ #1 
[ 2906.590783] [<c0014b64>] (unwind_backtrace) from [<c00120ec>] (show_stack+0x20/0x24) 
[ 2906.614046] [<c00120ec>] (show_stack) from [<c0549008>] (dump_stack+0x20/0x28) 
[ 2906.624803] [<c0549008>] (dump_stack) from [<c0022620>] (warn_slowpath_common+0x7c/0x9c) 
[ 2906.647925] [<c0022620>] (warn_slowpath_common) from [<c002266c>] (warn_slowpath_null+0x2c/0x34) 
[ 2906.668656] [<c002266c>] (warn_slowpath_null) from [<c001a888>] (__arm_ioremap_pfn_caller+0x240/0x25c) 
[ 2906.691936] [<c001a888>] (__arm_ioremap_pfn_caller) from [<c001a934>] (__arm_ioremap_caller+0x68/0x70) 
[ 2906.713171] [<c001a934>] (__arm_ioremap_caller) from [<c001a3d0>] (__arm_ioremap+0x24/0x2c) 
[ 2906.735043] [<c001a3d0>] (__arm_ioremap) from [<bf19c028>] (hello_init+0x28/0x88 [domotx]) 
[ 2906.755780] [<bf19c028>] (hello_init [domotx]) from [<c000873c>] (do_one_initcall+0x94/0x1e4) 
[ 2906.778165] [<c000873c>] (do_one_initcall) from [<c0087e70>] (load_module+0x1848/0x1e38) 
[ 2906.799410] [<c0087e70>] (load_module) from [<c008854c>] (SyS_init_module+0xec/0xf0) 
[ 2906.822660] [<c008854c>] (SyS_init_module) from [<c000e980>] (ret_fast_syscall+0x0/0x48) 
[ 2906.844558] ---[ end trace c7cdd8b3d5007a1b ]--- 
[ 2906.856382] Couldn't remap UART MMIO 

Что делать неправильно?

+0

У вас даже есть предупреждение! Недостаточно контекста, чтобы понять, о чем предупреждает. Лучше получить фрагменты кода вокруг bf19c028, c001a3d0, c001a934 и c001a888. – 0andriy

+0

Отлично! И как мне найти номер строки на ПК? Где-то есть файл карты? Я запускал 'objdump -S vmlinux', но это не похоже на трюк. Я уже нырнул в '__arm_ioremap_pfn_caller', но есть несколько мест, где возвращается« NULL ». ps: возможно, это уже ясно, но я новичок в Linux (драйверы ядра). – Tin

ответ

0

Я нашел решение проблемы, о которой сообщалось выше. На самом деле решение два раза:

  • BCM2835 техническое описание не афишируют физические адреса в их спецификации: Физических адресов в диапазоне от 0x20000000 до 0x20FFFFFF для периферийных устройств. Адреса шин для периферийных устройств настроены для сопоставления диапазона периферийных шин, начиная с 0x7E000000. Таким образом, периферийное устройство, рекламируемое здесь по адресу шины 0x7Ennnnnn, доступно по физическому адресу 0x20nnnnnnn.
  • Описана опечатка в таблице: PL011 USRT отображается на базовых сумматорах 0x7E20100., который должен быть PL011 USRT отображается на базовых сумматорах 0x7E20100 .
Смежные вопросы