嵌入式Linux驱动笔记-基本知识一
来源:互联网 发布:中云数据有限公司 编辑:程序博客网 时间:2024/05/01 04:16
一、驱动是硬件操作+内核编程(设备驱动)
1.字符设备驱动
2.访问控制(互斥)阻塞、唤醒
3.轮询异步通知,中断处理延时、内存分配、设备模型。
4.简单的字符设备驱动编写——基于子系统的驱动(I2C/SPI)
5.块设备驱动/网络设备驱动框架
二、说明:
内核模块(module):内核运行时可动态添加/删除的代码
内核的配置:< >为不编译;< * >为静态方式编译进内核(如:*.c --> *.o --> zImage);< M >为动态编译 (如:*.c --> *.o --> *.ko)
内核编译命令: make zImage 直接编译 和 make module模块动态方式编译.
以模块方式动态编译的优点:
1.没有编译进内核 ,这样可以使内核更加高效的运行
2.采用模块方式编译方便、灵活
3.模块不编译进内核不必遵守GPL协议所以保护知识产权。
模块和一般的c程序比较:
1.每个c程序都有一个mian()函数入口点;模块也有入口点 ,它的入口在模块加载函数开始 init_module(),这是调用内核的函数;
2.一般的C应用程序结束后系统会自动回收资源,但模块要自己申请资源回收,不然会一直运行运行直到系统重新运行。
模块的分类:驱动模块、文件系统模块、网络模块、个协议模块。
三、编写模块的三要素
1.模块的声明:MODULE_LICENSE("GPL"),内核若不声明此语句许可会导致整个模块的函数不能调用。
2.模块的加载函数(加载模块时执行)
内核API :int init_module(void);作用是申请资源。
3.模块卸载函数
内核API:void cleanup_module(void),其作用是释放资源。
模块编写所需头文件:#include <linux/module.h>
此头文件是放在内核源码的头文件中。
四、模块的相关命令
1.lsmod,用来查看系统已加载的模块信息。
2.insmod + xxx.ko,用于加载模块。
3.dmesg,查看内核打印的信息,可加 选项 “-c”,此选项只有管理员才能执行。
4.rmmod + xxx 或 xxx.ko,用于模块的卸载。
5.make clean,清楚中间编译生成的文件。
五、模块的编译条件
1.需要一个经过配置和编译的内核(源码)
2.模块编译所用内核版本和加载内核版本必须一致
六、模块编译
1.内部模块(internal_module)
2外部模块(external_modele)
注:源码考到内核中编译时叫内部模块,否则叫外部模块。
3.内部模块的编译: a.模块源码拷贝到内核源码相关目录下
b.修改kconfig(修改添加配置选项)
c.配置选项 d.修改Makefile
e.编译所以模块,命令“make modules”
- 嵌入式Linux驱动笔记-基本知识一
- 嵌入式Linux驱动笔记-基本知识二
- 嵌入式Linux设备驱动开发笔记(一)
- 嵌入式Linux驱动笔记(一)------第一个LED驱动程序
- 嵌入式Linux驱动学习笔记(一)------第一个LED驱动程序
- 嵌入式linux驱动-触摸屏笔记
- 嵌入式linux驱动-I2C笔记
- 嵌入式linux驱动-DMA笔记
- 嵌入式linux驱动-网络设备驱动笔记
- linux 驱动笔记(一)
- 嵌入式Linux实验笔记(一)
- 【嵌入式Linux驱动开发】一、简介
- 嵌入式Linux设备驱动开发(一)
- 嵌入式LINUX驱动笔记1---创世纪
- 嵌入式linux驱动-输入子系统笔记
- 嵌入式linux驱动-块设备笔记
- 嵌入式linux驱动-nand flash笔记
- 嵌入式linux驱动-nor flash笔记
- Exericse 4.1
- bootstrap2轮播
- pg:pager标签运用
- sqlite日期时间函数用法
- 如何写一篇好的技术博客
- 嵌入式Linux驱动笔记-基本知识一
- dataStage 7.5.1A
- Uva 6430- Points ...简单DP
- Android实现推送方式解决方案
- PISA - Programme for International Student Assessment
- VideoView 开始暂停监听
- 集合的划分
- 致青春和易碎的梦
- wikioi 1026 逃跑的拉尔夫