Linux openwrt 设备驱动的第一个例子
hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("HI");
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello, world/n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye, Hello, world/n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
KERN_DIR = /home/river/openwrt/openwrt-hiwooya-stable/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7688/linux-3.18.45
TOOLCHAIN = /home/river/openwrt/openwrt-hiwooya-stable/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-
all:
make -C $(KERN_DIR) ARCH=mips CROSS_COMPILE=$(TOOLCHAIN) M=$(PWD) modules
clean:
rm -f *.ko
rm -f *.o
rm -f *.mod.c
rm -f *.mod.o
rm -f *.order
rm -f *.sysvers
obj-m +=hello.o
编译与加载
root@hi-wooya:/# insmod hello.ko
[ 6586.120000] Hello, world/nroot@hi-wooya:/#
root@hi-wooya:/# ls
bin lib root usr
dev mnt sbin var
etc overlay sys www
gateway-log.txt proc tmp
hello.ko rom ttest
root@hi-wooya:/# lsmod
crc_ccitt 1003 1 ppp_async
ehci_hcd 31420 1 ehci_platform
ehci_platform 3728 0
gpio_button_hotplug 6000 0
hello 556 0
root@hi-wooya:/# rmmod hello
[ 7075.450000] Goodbye, Hello, world/n
1. insmod
加载模块的代码段和数据段到内核,并且调用模块的初始化函数来启动所有东西.
2. rmmod
如果内核认为模块还在用( 就是说, 一个程序仍然有一个打开文件对应模块输出的设备 ), 或者内核被配置成不允许模块去除, 模块去除会失败.
3. lsmod
生成一个内核中当前加载的模块的列表. lsmod 通过读取 /proc/modules 虚拟文件工作. 当前加载的模块的信息也可在位于 /sys/module 的 sysfs 虚拟文件系统找到.
4. 前面的屏幕输出是来自一个字符控制台; 如果你从一个终端模拟器或者在窗口系统中运行 insmod 和 rmmod, 你不会在你的屏幕上看到任何东西. 消息进入了其中一个系统日志文件中, 例如 /var/log/messages.
5. vermagic.o目标文件:
当加载一个模块时,内核为模块检查特定处理器的配置选项,确定它们匹配运行的内核。如果模块用不同选项编译,则不会加载。出现下面内容:
insmod hello.ko
查看系统日志文件(var/log/message)将发现导致模块无法加载的原因
本文参考一些网上的例子,结合自己的编译环境,进行测试