Я работаю на 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(), но я в замешательстве. Буду признателен за любую помощь.
кода ядра уже имеет доступ ко всей памяти, не нужно открывать '/ DEV/mem'. Просто будьте осторожны с физическими адресами и виртуальными адресами. –