0. 编写编译驱动的Makefile
ROOM_DIR = /nfs/rootfs/home/2.study/
DEMO_DIR = /home/linux/1-DataShare/0.交叉编译工具链/0.exynos-4412/gcc-4.6.4/bin/arm-arm1176jzfssf-linux-gnueabi-
GCC = $(DEMO_DIR)gcc
ifeq ($(KERNELRELEASE), )
KERNEL_DIR = /home/linux/1-DataShare/1-系统移植/2-内核移植/1.完成版1_3.14.28/
CUR_DIR = $(shell pwd)
all:
make -C $(KERNEL_DIR) M=$(CUR_DIR) modules
$(GCC) ./main.c -o main
clean:
make -C $(KERNEL_DIR) M=$(CUR_DIR) clean
install:
sudo cp -raf *.ko main $(ROOM_DIR)
else
obj-m += led.o
endif
insmod xxx.ko
lsmod xxx.ko
rmmod xxx
1.Linux 驱动基本框架
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
static int __init led_dev_init(void)
{
printk("_____%s_____\n", __FUNCTION__);
return 0;
}
static void __exit led_dev_exit(void){
printk("_____%s_____\n", __FUNCTION__);
}
module_init(led_dev_init);
module_exit(led_dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Dallan");
MODULE_DESCRIPTION("Demo");
MODULE_ALIAS("First");
2.外部函数的调用
#ifndef __MATH_H__
#define __MATH_H__
int my_add(int a, int b);
#endif
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
int my_add(int a, int b)
{
return a+b;
}
EXPORT_SYMBOL(my_add);
MODULE_LICENSE("GPL");
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include "math.h"
static int id = 1;
static int __init led_dev_init(void)
{
printk("_____%s_____\n", __FUNCTION__);
printk("id+1 = %d \n", my_add(id, 1));
return 0;
}
static void __exit led_dev_exit(void){
printk("_____%s_____\n", __FUNCTION__);
}
module_init(led_dev_init);
module_exit(led_dev_exit);
MODULE_LICENSE("GPL");
3.内核模块传参
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
static int id = 88;
static char *name = "Dream";
module_param(a, int, 0644);
module_param(buf, charp, S_IRUGO | S_IWUSR);
static int __init led_dev_init(void)
{
printk("_____%s_____\n", __FUNCTION__);
printk("%s:id+1 = %d \n", name, my_add(id, 1));
return 0;
}
static void __exit led_dev_exit(void){
printk("_____%s_____\n", __FUNCTION__);
}
module_init(led_dev_init);
module_exit(led_dev_exit);
MODULE_LICENSE("GPL");
insmod xxx.ko a=1 name="Mark"