Задать вопрос

Модуль ядра для OpenWRT. PowerPC

Собираю OpenWRT Trunk для одной специфической железяки на процессоре PowerPC (последнее не очень важно, просто привожу для справки).

И требуется мне написать дрйвер. Небольшой опыт разработки модулей ядра для х86 машины, под управлением Ubuntu имеею (проходил курсы, писал тестовые игровые модули).
Ныне хочу попробовать написать хотя бы модуль «Hello World». Начал с отличного поста камрада Ariman. Но сразу натолкнулся на то, что у меня иная структура папок

А именно
В статье сказанно:

Заходим в target/linux/ar71xx/files/drivers и выполняем там mkdir video, создав директорию для нашего драйвера. Buildroot раскидывает содержимое files по соответствующим директориям дерева исходников. Помещаем файл usblcd.c в только что созданную папку.


В моём случае папка будет иметь вид: ~/trunk/openwrt-trunk/target/linux/mpc83xx/files, но в ней уже нет папки drivers. Там просто выглядит всё так:

dlinyj@dlinyj-System:~/trunk/openwrt-trunk/target/linux/mpc83xx/files$ ls
scripts


В папке только скрипты. Следовательно тут ждал меня облом



В результате я нал гуглить альтернативы, нашёл отличный пример: sites.google.com/site/guenterbartsch/blog/myfirstlinuxkernelmodule. Казалось бы, что нужно для счастья! Переписал Makefile для своих нужд (относительные пути проверенные и перепроверенные) такого вида:

OPENWRT = /home/dlinyj/trunk/openwrt-trunk
KERNEL = /home/dlinyj/trunk/openwrt-trunk/build_dir/linux-mpc83xx/linux-3.3.8
PWD := $(shell pwd)

LD= /home/dlinyj/trunk/openwrt-trunk/staging_dir/toolchain-powerpc_gcc-4.6-linaro_uClibc-0.9.33.2/bin/powerpc-openwrt-linux-uclibc-ld
CROSS_COMPILE="powerpc-openwrt-linux-uclibc-"
EXTRA_LDSFLAGS="-I/home/dlinyj/trunk/openwrt-trunk/build_dir/linux-mpc83xx -include symtab.h"
KBUILD_HAVE_NLS=no
CONFIG_SHELL="/bin/bash" 

TARGET = hellok

CC=/home/dlinyj/trunk/openwrt-trunk/staging_dir/toolchain-powerpc_gcc-4.6-linaro_uClibc-0.9.33.2/bin/powerpc-openwrt-linux-uclibc-gcc
obj-m := $(TARGET).o

all:
        make -C /home/dlinyj/trunk/openwrt-trunk/build_dir/linux-mpc83xx/linux-3.3.8/ ARCH="powerpc"  M=$(PWD) modules



Полностью согласно исходному материалу. Запускаю make и получаю:

dlinyj@dlinyj-System:~/myprg_ppc/first_hello$ make
make: Цель `all' не требует выполнения команд.


Правлю строку all, добавляю: all: $(TARGET).o

После чего получаю такой результат:

dlinyj@dlinyj-System:~/myprg_ppc/first_hello$ make
/home/dlinyj/trunk/openwrt-trunk/staging_dir/toolchain-powerpc_gcc-4.6-linaro_uClibc-0.9.33.2/bin/powerpc-openwrt-linux-uclibc-gcc    -c -o hellok.o hellok.c
powerpc-openwrt-linux-uclibc-gcc: warning: environment variable 'STAGING_DIR' not defined
hellok.c:1:26: fatal error: linux/module.h: No such file or directory
compilation terminated.
make: *** [hellok.o] Ошибка 1


Это понятно на что оно ругается, первой строкой в исходнике идёт

#include <linux/module.h>  /* Needed by all modules */


Но какого рожна она его не находит, когда я всё описал… В общем, буду крайне признателен, кто подскажет с какого края подступится к этой проблеме. Повазюкает мордой об стол. Ибо я уже два дня бьюсь, много копий сломал, но так и не знаю как подступиться (а сроки вместе с начальством уже пресуют)

З.Ы. Главное, что в самой системе некоторые драйвера удалось доработать напильником, чтобы она завелась, а вот свой написать, да ещё и модуль — никак :(.
  • Вопрос задан
  • 4992 просмотра
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@theaspin
Директория files в target/linux/mpc83xx содержит файлы, которые будут скопированы в директорию ядра перед компиляцией. Для каждой платформы структура и файлы будут свои. Если нет директории drivers — ее нужно создать.
Ответ написан
dlinyj
@dlinyj Автор вопроса
jcmvbkbc

Большое спасибо, что отозвались помочь. Конфиг вот. А вот версию опенврт, к своему стыду посмотреть не знаю как. И помню, что были какие-то мегагемморои по её сборке (правил какие-то конфиги)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы