Собираю 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 */
Но какого рожна она его не находит, когда я всё описал… В общем, буду крайне признателен, кто подскажет с какого края подступится к этой проблеме. Повазюкает мордой об стол. Ибо я уже два дня бьюсь, много копий сломал, но так и не знаю как подступиться (а сроки вместе с начальством уже пресуют)
З.Ы. Главное, что в самой системе некоторые драйвера удалось доработать напильником, чтобы она завелась, а вот свой написать, да ещё и модуль — никак :(.