写的第一个驱动是将cpu的GPIOi电平拉低,这样可以使MCU查询到该PIN值为O,从而执行关机断电的操作。
1、gpioi.c
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int gpioi_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void gpioi_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(gpioi_init);
module_exit(gpioi_exit);
2、Makefile:
KERNELDIR := /home/xxx/Project/kernel
PWD := $(shell pwd)
CC=arm-linux-gcc
obj-m := gpioi.o
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.ko *.o *.mod.*3、装载/卸载模块
#insmod gpioi.ko
提示:"insmod :cannot insmod gpioi.ko. success(8),success."
#dmesg |tail 查看内核打印的信息。
#modinfo gpioi.ko 查看该驱动模块的VERMAGIC(红色部分),发现内核版本与模块版本不一致。filename: gpioi.ko
license: Dual BSD/GPL
author:
description: A simple Module
alias: a simplest module
vermagic: 2.6.14 sdk-2.3-3 gcc-4.0
depends:
#echo 15 > /proc/sys/kernel/printk 打印所有内核消息到console
但是发现终端打印消息不同步,有一点延迟,比如某个函数都已经执行完了,而printk的消息还没有完全打印出来。如果你有好的解决办法,还望不吝赐教。注:
a、KERNELDIR所指向的kernel要事先编译好,否则会出错。
b、内核版本与模块版本不一致。version magic 问题:重新make menuconfig ,“General Setup"->修改Local kernel version名称,使其与kernel的VERMAGIC_STRING保持一致。
参考资料:
《内核模块加载时的版本检查》,http://blog.chinaunix.net/u2/70379/showart_1138667.html
阅读(1085) | 评论(0) | 转发(0) |