Linux设备驱动编写基础

一、linux中的驱动是以模块的形式存在的,这样就大大提高了驱动的灵活性,linux内核模块的程序结构如下:

l  模块加载函数(必须):module_init()

l  模块卸载函数(必须):module_exit()

l  模块许可证声明(必须):MODULE_LECENSE(“GPL”)

l  模块参数(可选):module_param(a,int,0400)

l  模块到处符号(可选):EXPORT_SYMBOL_GPL(func)

l  模块作者声明等其他信息(可选):MODULE_AUTHOR(“name”);

对于模块参数需要使用下面方式进行操作:

module_patam(a,int,04000);

MODULE_PARAM_DESC(a,”description”);

#insmod  module.ko a=100

导出符号的作用:例如一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。

在模块mod1中,EXPORT_SYMBOL(func1);

在模块mod2中,extern intfunc1();

就可以在mod2中调用func1了。

一个例子:

#include<linux/module.h>

#include<linux/moduleparam.h>

#include<linux/kernel.h>

#include<linux/init.h>

#include<linux/stat.h>

#defineDRIVER_AUTHOR "Foobar"

#define DRIVER_DESC   "A sample driver"

MODULE_LICENSE("GPL");

MODULE_AUTHOR(DRIVER_AUTHOR);

MODULE_DESCRIPTION(DRIVER_DESC);

MODULE_SUPPORTED_DEVICE("TestDevice");

static short intmyshort = 1;

static int myint= 420;

static long intmylong = 9999;

static char*mystring = "blah";

static intarray[2]= {-1, -1};

static intarr_argc = 0;

module_param(myshort, short, 0400);

MODULE_PARM_DESC(myshort, "A short integer");

module_param(myint, int, 0400);

MODULE_PARM_DESC(myint, "An integer");

module_param (mylong,long, 0000);

MODULE_PARM_DESC(mylong, "A long integer");

module_param(mystring, charp, 0000);

MODULE_PARM_DESC(mystring, "A character string");

module_param_array(array, int, &arr_argc, 0000);

//module_param_array(array, int, arr_argc, 0000); //for kernel<2.6.10

MODULE_PARM_DESC(array, "An array of integers");

static int__init hello_2_init (void)

{

int i;

printk (KERN_INFO "myshort is ashort integer: %hd\n", myshort);

printk (KERN_INFO "myint is aninteger: %d\n", myint);

printk (KERN_INFO "mylong is along integer: %ld\n", mylong);

printk (KERN_INFO "mystring is astring: %s\n\n", mystring);

for (i=0; i<arr_argc; i++)

printk (KERN_INFO"array[%d] = %d\n",i, array[i]);

printk (KERN_INFO "Got %darguments in array\n", arr_argc);

return 0;

}

static void__exit hello_2_exit (void)

{

printk (KERN_INFO "hello drivercleaned up\n");

}

module_init(hello_2_init);

module_exit(hello_2_exit);

二、驱动模块的编译

编译需注意:内核源码路径必须是配置好的切编译过的

ifeq($(KERNELRELEASE),)

#KERNELDIR ?=/home/lht/kernel2.6/linux-2.6.14

KERNELDIR ?=/lib/modules/$(shell uname -r)/build

PWD := $(shellpwd)

modules:

$(MAKE)-C $(KERNELDIR) M=$(PWD) modules

modules_install:

$(MAKE)-C $(KERNELDIR) M=$(PWD) modules_install

clean:

rm -rf *.o *~ core .depend .*.cmd *.ko*.mod.c .tmp_versions modules* Module*

.PHONY:modules modules_install clean

else

obj-m := hello.o

endif

linux设备驱动编写基础相关推荐

  1. Linux设备驱动开发基础

    1.驱动概述和开发环境搭建 1.1驱动设备的作用 对设备驱动最通俗的解释就是"驱动硬件设备行动".驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的 ...

  2. 应用QQ2440(s3c2440)ARM开发板驱动MMA7455加速度计的linux设备驱动编写

    课题水下机器人需要测定水下机器人的位姿,为此应用了加速度计MMA7455,该传感器可以用SPI或I2C读取数字信号到MCU. 驱动MMA7455在atmega128上已经实现,但是由于mega128的 ...

  3. 《Linux设备驱动开发详解(第2版)》隆重出版

    Linux设备驱动开发详解(第2版)(前一版狂销3万册,畅销书最新升级) [新品] 点击看大图     基本信息 * 作者: 宋宝华       * 出版社:人民邮电出版社     * ISBN:97 ...

  4. 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念

    linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  5. linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...

    linux设备驱动归纳总结(一):内核的相关基础概念 1. 内核与 linux 设备驱动的作用与关系 内核:用于管理软硬件资源,并提供运行环境.如分配 4G 虚拟空间等. linux 设备驱动:是连接 ...

  6. 【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念

    linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10.04 开发平台:S3C2440开发板 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  7. linux驱动基础开发0——linux 设备驱动概述-转

    目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer):       主要利用C库函数和Linux API进行应用 ...

  8. linux设备驱动归纳总结(一)内核的相关基础概念【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59413.html linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxx ...

  9. Linux设备驱动归纳总结(一):内核的相关基础概念

    目录 一.Linux设备驱动的作用: 二.内核代码树介绍: 三.内核补丁: 四.内核中的Makefile: 五.子目录下的Makefile和Kconfig: 六.内核和模块的编译 七.总结 一.Lin ...

最新文章

  1. linux 程序输出 logo,Linux下制作logo并显示到开发板上
  2. 通过enum实现枚举类
  3. 对UTF8编码的初步认识!
  4. mongodb$pull数组更新操作符
  5. windows 安装pip 和 pychar 安装pymysql
  6. python怎么调用接口失败_python 调用接口
  7. 2020 年,网络安全方面 5 大值得学习的编程语言
  8. 使用mongoose-paginate-v2查询缓慢问题
  9. struts2.xml中使用chain和redirectAction这两个类型结果(type-result)时,报检查错误(validation)...
  10. 使用Badboy录制脚本
  11. android ndk adk 旧版本下载
  12. 【新征程】1、考研路漫漫
  13. erp管理系统软件价格
  14. 博弈论总结(题目合集)
  15. Flutter 字体设置加粗
  16. 怎么解log方程_对数方程的解法
  17. [转]Android面试系列之一
  18. Unity3D教程:手游开发常用排序算法 -下
  19. JavaScript:表格生成器
  20. 计算机组成原理-溢出-算术移位的溢出

热门文章

  1. 神经网络入门--连载1
  2. ID的权限问题导致免密码登录失效
  3. .NET基础架构方法—DataTableToExcel通用方法
  4. Velocity 模板引擎介绍
  5. 从页面底部向上弹出dialog,消失时逐渐向下(转)
  6. HTML5 Canvas平移,放缩,旋转演示
  7. (转)向SDE库中写入栅格和矢量数据
  8. VS20“.NET研究”10自定义新建文件模版
  9. 饿了么口碑实现超30亿美元融资,引领本地生活数字化升级...
  10. springboot项目中jdk版本的问题