Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2414622
  • 博文数量: 298
  • 博客积分: 7876
  • 博客等级: 准将
  • 技术积分: 5500
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-23 13:39
文章存档

2013年(2)

2012年(142)

2011年(154)

分类: LINUX

2011-03-24 12:28:36

1)初识linux字符设备驱动程序

 

注:所以文章红色字体代表需要特别注意和有问题还未解决的地方,蓝色字体表示需要注意的地方

1.本文所介绍的程序平台

开发板:arm9-mini2440

虚拟机为:Red Hat Enterprise Linux 5

开发板上系统内核版本:linux-2.6.32.2

 

2.程序清单

本次实验程序为国嵌培训代码,本人作了改动和较为详细的注释,如有错误请指出。

 

1)模块参数传递

gong.h

 

#define GONG 30

 

hello.c

 

#include

#include

#include "gong.h"

 

MODULE_LICENSE("GPL");

 

static char *name = "gongzhi";

static int age = GONG;

 

module_param(age, int, S_IRUGO);

module_param(name, charp, S_IRUGO);

 

static int hello_init(void)

{

    printk(KERN_EMERG" Name : %s \n", name);

    printk(KERN_EMERG" Age  : %d \n", age);

    return 0;

 

}

 

static int hello_exit(void)

{

    printk(KERN_INFO"module exit \n");

}

 

module_init(hello_init);

module_exit(hello_exit);

 

2)外函数

add.c

 

int add(int a, int b)

{

    return a+b;

}

 

main.c

 

#include

#include

 

MODULE_LICENSE("GPL");

MODULE_AUTHOR("gongzhi");

MODULE_DESCRIPTION("hello world module");

MODULE_ALIAS("a simplest module");

 

extern int add(int a, int b);

 

static int __init hello_init()

{

    printk("hello world \n");

    add(1, 2);

    return 0;

}

 

static void __exit hello_exit()

{

    printk("hello exit \n");

}

 

module_init(hello_init);

module_exit(hello_exit);

 

Makefile

 

ifneq ($(KERNELRELEASE),)

 

obj-m := myadd.o

myadd-objs := main.o add.o

 

else

        

KDIR := /lib/modules/2.6.18-194.el5/build

all:

         make -C $(KDIR) M=$(PWD) modules

clean:

         rm -f *.ko *.o *.mod.o *.mod.c *.symvers

 

endif

 

2)模块函数混合,必须先编译依赖的模块

 

cal.c

 

#include

#include

 

MODULE_LICENSE("GPL");

 

int add_integar(int a, int b)

{

    return a+b;

}

 

int sub_integar(int a, int b)

{

    return a-b;

}

 

static int __init sym_init()

{

    return 0;

}

 

static void __exit sym_exit()

{

   

}

module_init(sym_init);

module_exit(sym_exit);

 

EXPORT_SYMBOL(add_integar);

EXPORT_SYMBOL(sub_integar);

 

hello.c

 

#include

#include

 

MODULE_LICENSE("GPL");

 

extern int add_integar(int a, int b);

extern int sub_integar(int a, int b);

 

static int __init hello_init()

{

    int res = add_integar(1, 2);

    return 0;

 

}

 

static void __exit hello_exit()

{

    int res = sub_integar(2, 1);

}

 

module_init(hello_init);

module_exit(hello_exit);

 

 

 

 

 

阅读(847) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:(1)初识linux字符设备驱动程序--1

给主人留下些什么吧!~~