Chinaunix首页 | 论坛 | 博客
  • 博客访问: 464675
  • 博文数量: 134
  • 博客积分: 3056
  • 博客等级: 中校
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-14 15:53
文章分类
文章存档

2013年(1)

2010年(133)

我的朋友

分类: LINUX

2010-07-31 22:51:32

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
阅读(1248) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~