2014-10-16 4 views
-1

Я работаю на Raspberry PI (Linux RPI 3.12.28+) и у меня есть следующий код C, который можно использовать для управления GPIO порты:Access/DEV/MEM из модуля ядра Linux

// IO Acces 
struct bcm2835_peripheral { 
unsigned long addr_p; 
int mem_fd; // memory file descriptor 
void *map; 
volatile unsigned int *addr; 
}; 

struct bcm2835_peripheral gpio = {0x40000000}; 

// Exposes the physical address defined in the passed structure using mmap on /dev/mem 
int map_peripheral(struct bcm2835_peripheral *p) 
{ 
    // Open /dev/mem 
    if ((p->mem_fd = open("/dev/mem", O_RDWR | O_SYNC)) < 0) { 
     return -1; 
    } 

    p->map = mmap(
     NULL, 
     BLOCK_SIZE, 
     PROT_READ | PROT_WRITE, 
     MAP_SHARED, 
     p->mem_fd, // File descriptor to physical memory virtual file '/dev/mem' 
     p->addr_p // Address in physical map that we want this memory block to expose 
    ); 

    if (p->map == MAP_FAILED) { 
     return -1; 
    } 

    p->addr = (volatile unsigned int *)p->map; 

    return 0; 
} 

Над кодом работает нормально для обычных программ (пользовательское пространство). Но мне нужно создать модуль ядра Linux, который будет делать то же самое. Проблема в том, что компилятор не распознает такие методы, как open() или mmap(). Что такое подходящий подход для преобразования этого кода в модуль ядра (драйвер)? Доступны ли эти функции для программирования ядра или я должен делать это по-другому? Я видел такие методы, как syscall_open(), filp_open(), sys_mmap2(), но я в замешательстве. Буду признателен за любую помощь.

+1

кода ядра уже имеет доступ ко всей памяти, не нужно открывать '/ DEV/mem'. Просто будьте осторожны с физическими адресами и виртуальными адресами. –

ответ

0

Верно, что в модулях ядра нет необходимости обращаться к /dev/mem. Прямой доступ к памяти с помощью phys_to_virt - это решение для управления памятью, но это не будет работать на PIP малины, если целью является управление портами GPIO.

Решение заключается в доступе к регистрам оборудования. Я нашел отличный учебник здесь:

Creating a Basic LED Driver for Raspberry Pi

1

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

Учитывая, что вы обращаетесь к /dev/mem Предположим, вы пытаетесь прочитать физическую память RaspberyPi. Из пространства ядра вы можете получить к нему доступ напрямую, так как нет защиты памяти, но вам нужно будет использовать функцию phys_to_virt для перевода адресов.

Смежные вопросы