1. 我的开发环境:
主机:ubuntu9.04+ARM交叉编译工具(arm-linux-gcc的版本是4.3.2)+IP地址为:192.168.1.222
目标板:mips开发板(系统是uclinux,内核linux-2.4.x)+uclinux安装了tftp命令+IP地址为:192.168.1.230
2. 一个最简单的驱动程序示例程序hello world,源码如下:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, Michael Yao\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, Michael Yao\n Love Linux\n");
}
module_init(hello_init);
module_exit(hello_exit);
|
3. Makefile文件如下(可作2.6内核下单/多源文件Makefile文件模板)
# Linux Device Driver Programming
# Michael Yao
# The path of kernel source code
KERNELDIR = /opt/friendly_ARM/mini2440/linux-2.6.29 #内核源码安装目录
#currnet path
PWD := $(shell pwd)
# Compiler
CROSS_COMPILE = /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-
CC = $(CROSS_COMPILE)gcc
# Compilation Options
ifdef CONFIG_SMP
CFLAGS+=-D__SMP__ -DSMP
endif
CFLAGS +=
obj-m := helloworld.o #$(YOUR_TARGET)-objs := relied_source_file1.o relied_source_file2.o ... relied_source_fileN #N 是你的目标代码生成所依赖的源文件个数
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
install:
cp helloworld.ko /tftpboot #已经安装并启动tftp服务
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions module*.* Module.* .PHONY:all install clean
|
4. 输入make指令
5. 输入'make install'指令,拷贝helloworld.ko到/tftpboot目录下
6. 在开发板(mini2440)控制终端里输入
[root@FriendlyARM /]# cd tmp/
[root@FriendlyARM /tmp] # tftp -gr helloworld.ko 192.168.1.222
|
7. 装载、查看、卸载模块
[root@FriendlyARM /tmp]# insmod helloworld.ko
Hello, Michael Yao
[root@FriendlyARM /tmp]# lsmod
helloworld 1012 0 - Live 0xbf003000
[root@FriendlyARM /tmp]# rmmod helloworld
Goodbye, Michael Yao
Love Linux
|
带参数的hello,world模块
1. 源码如下helloworld_param.c
#include
#include
#include //2.6以后必须使用带参数的模块必须显式包含此头文件,原因见 linux2.4和linux2.6模块参数的比较(两个版本驱动移植)
MODULE_LICENSE("Dual BSD/GPL");
static char *whom = "world";
static int howmany = 1;
static int array[] = {1,2,3,4};
static int array_num = 4;
module_param(howmany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO);
module_param_array(array, int , &array_num, S_IRUGO);
static int hello_init(void)
{
int i;
for (i = 0; i < howmany; i++)
printk(KERN_ALERT "(%d) Hello, %s!\n", i, whom);
for (i = 0; i < 8; i++)
printk(KERN_ALERT "array[%d] : %d \n", i, array[i]);
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, Michael Yao!\n");
}
module_init(hello_init);
module_exit(hello_exit);
|
2. Makefile文件与上一节的区别仅在
obj-m := helloworld_param.o #差别仅在模块目标的名称的改变
|
3. 'make && make install'
4. 在开发板/tmp目录下,用tftp命令从PC机下载hellworld_param.ko
[root@FriendlyARM /tmp]
# tftp -gr helloworld_param.ko 192.168.1.222
|
5. 不使用参数,装载模块卸载模块
[root@FriendlyARM /tmp]# insmod helloworld_param.ko
(0) Hello,
array[0] : 1
array[1] : 2
array[2] : 3
array[3] : 4
array[4] : 4
array[5] : 1
array[6] : -1069724320
array[7] : -1069724320
[root@FriendlyARM /tmp]# rmmod helloworld_param
Goodbye, Michael
|
6. 带参数,装载、卸载模块[root@FriendlyARM /tmp]# insmod helloworld_param.ko howmany=4
(0) Hello,
(1) Hello,
(2) Hello,
(3) Hello,
array[0] : 1
array[1] : 2
array[2] : 3
array[3] : 4
array[4] : 4
array[5] : 1
array[6] : -1069724320
array[7] : -1069724320
|
7. 当装载模块时候,array数组的个数array_num>4时
[root@FriendlyARM /tmp]# insmod helloworld_param.ko howmany=4 whom="michael" array=1,3,5,7, 2,4,6,8
array: can only take 4 arguments
helloworld_param: `1' invalid for parameter `array'
insmod: cannot insert 'helloworld_param.ko': invalid parameter
|
8. 修改源码helloworld_param.c,array数组初始化时,数组元素为8个
static int array[] = {1,1,1,1,2,2,2,2};
|
9. 重复2-6步,然后再装入模块
[root@FriendlyARM /tmp]# insmod helloworld_param_modified.ko howmany=4 whom="michael" array=1,3,5,7,2,4,6,8
(0) Hello, michael! (1) Hello, michael! (2) Hello, michael! (3) Hello, michael! array[0] : 1 array[1] : 3 array[2] : 5 array[3] : 7 array[4] : 2 array[5] : 4 array[6] : 6 array[7] : 8
|
10.
实验结果说明:
源码中声明的变量并不会对数组的元素的个数起作用(
module_param_array(array, int , &array_num, S_IRUGO);
),
这也表明这些用C写的函数,并不会改变C的基本规则(数组初始化)11. done
阅读(1258) | 评论(0) | 转发(0) |