[1]コースの概要
1. Linuxカーネルモジュール
2.キャラクターデバイスドライバー
3.同時実行性と競合状態のソリューション
4. IOモデル
5. Linuxカーネル割り込み
6.プラットフォームバスドライバー
7. i2cバスドライバー
8. spiバスドライバー
9。ブロックデバイスドライバー
10.ネットワークカードデバイスドライバー
[2]
職場でのLinuxデバイスドライバー開発、
Androidデバイスドライバー開発
[3]ドライバーとは何ですか?アームベアメタルドライバーとLinuxデバイスドライバーの違いは何ですか?
ドライブ:ハードウェアを駆動して、ソフトウェアコード
を共通に動作させる:
ハードウェアの動作を駆動できる
さまざまなポイント:
ARMベアメタルドライブ:実行の順序に従ってのみ
実行できるコード、このコードは単独で実行でき、依存しないその
彼のコード。
Linux设备驱动:它是基于Linux内核才能够操作硬件,
如果没有Linux内核,驱动不能单独执行,也不能自动
执行(必须通过应用层控制才能执行)。可以同时安装
多个Linux设备驱动
[4] Linuxシステムレベルの
アプリケーションレイヤー:[0-3G]
APP glibc
---------------(system call swi)-------------- ----------------
カーネル層:5つの主要な機能[3-4G]
ファイル管理:ファイルシステムext2 ext3 ext4 yaffs jiffeなどを介してファイルを整理および
管理します。
メモリ管理:メモリを介して(スラブ)メモリの割り当てと解放を行う管理ユニット。
プロセス管理:プロセスの作成、破棄、プロセススケジューリング、その他の機能を
管理します。ネットワーク管理:ネットワークデータは、ネットワークプロトコルスタックを介して送受信されます。
デバイス管理:デバイスドライバー管理。
キャラクターデバイスドライバー:バイトストリームに従って、順番にアクセスします。訪問した。
ブロックデバイスドライバー:ブロック(512バイト)によるアクセス、シーケンシャル
または順不同でアクセス可能
ネットワークカードデバイスドライバー:ネットワークカードデバイスドライバーにデバイスファイルがありません。
(このデバイスを介したネットワークデータ送信)
ハードウェアレイヤー:LEDカメラLCDタッチスクリーン
サウンドカードグラフィックカードビープUSBマウスUディスクハードディスク
フラッシュスイッチルーター猫ネットワークカードなど
[5] Linuxデバイスドライバーは
demo.c <====キャラクターデバイスドライバーを使用します
Kconfig :生成选项菜单的文件
/home/linux/kernel/kernel-3.4.39/drivers/char
config FARSIGHT_DEMO (选项名)
tristate "test test test ..." (选项菜单名)
help
this is a driver demo
.config :保存选配号的选项
CONFIG_FARSIGHT_DEMO=y
CONFIG_FARSIGHT_DEMO=m
#CONFIG_FARSIGHT_DEMO is not set
Makefile :用来编译驱动模块的
obj-$(CONFIG_FARSIGHT_DEMO) += demo.o
obj-y +=demo.o
obj-m +=demo.o
编译:
y:
make uImage ===>将驱动编译到uImage中
m:
make modules ===>将驱动编译生成xxx.ko文件
[6] Linuxカーネルモジュール
模块三要素:内核模块不能单独执行,也不能自动自行
入口
static int __init demo_init(void)
{
return 0;
}
module_init(demo_init);
出口
static void __exit demo_exit(void)
{
}
module_exit(demo_exit);
许可证
MODULE_LICENSE("GPL");
内部编译:在内核源码树中编译
外部编译:在内核源码树外进行编译
Makefile:
KERNELDIR:= /lib/modules/$(shell uname -r)/build/
//这是Makefile中的一个变量,记录ubuntu内核的路径的
//$(shell 命令) 在Makefile中起一个终端,执行命令,将
//将命令执行的结果作为返回值
PWD:=$(shell pwd)
//PWD它是记录驱动所在目录的一个变量。
all:
//all是make执行的时候的默认的标签,
//这个all的名字也可以随意指定(如modules)
make -C $(KERNELDIR) M=$(PWD) modules
//make -C dir 进入到dir目录下执行它里面的Makefile文件
//M 它是记录程序当前路径的一个变量
//make modules 编译模块,只编译M指定的目录下的模块
clean:
make -C $(KERNELDIR) M=$(PWD) clean
//make -C dir 进入到dir目录下执行它里面的Makefile文件
//M= 它是记录程序当前路径的一个变量
//make clean 清除编译,只清除M指定的目录下的模块文件
obj-m:=demo.o
//指定的要编译的模块的名字
Makefile中四种赋值的区别?
=
查找Makefile中变量最后一次被赋值
的结果,然后将它赋值给新的变量
var1=abc
var2=$(var1)
var1=def
all:
@echo $(var1) #def
@echo $(var2) #def
:= 立即赋值
var1=abc
var2:=$(var1)
var1=def
all:
@echo $(var1) #def
@echo $(var2) #abc
+= 附加赋值
var1=abc
var2=def
var2+=$(var1)
all:
@echo $(var1) #abc
@echo $(var2) #def abc
?= 询问赋值:询问变量之前是否被赋值过,
如果变量之前没有被赋值过本次赋值成立,
否则本次赋值不成立
var1?=def
all:
@echo $(var1) #def
var1=abc
var1?=def
all:
@echo $(var1) #abc
[7]ドライバーのインストールとアンインストール用のコマンド
sudo insmod xxx.koドライバーのインストール
lsmodモジュールがインストールされているかどうかの確認
sudo rmmod xxxアンインストールドライバー
modinfo xxx.koモジュールのさまざまな情報を確認するコマンド
dmesg printk
sudo dmesg- によって出力されたメッセージを確認しますc最初にそれを端末に表示し、次にメッセージを消去します
sudo dmesg -C直接メッセージを消去します
[8]カーネル印刷関数
printk(印刷レベル "制御形式"、変数);
printk( "制御形式"、変数); //デフォルトの
カーネルの8つの印刷レベルは次のように使用され、数値が小さいほど優先順位が高くなります。
#define KERN_EMERG“ <0>”
/ *システムは使用できません/
#define KERN_ALERT“ <1>”
/すぐに対処する必要があります/
#define KERN_CRIT“ <2>”
/クリティカル条件/
#define KERN_ERR“ <3>”
/エラー条件/
#define KERN_WARNING“ <4>”
/警告条件/
#define KERN_NOTICE“ <5>”
/正常だが重要な条件/
#define KERN_INFO“ <6>”
/情報/
#define KERN_DEBUG“ <7>”
/デバッグレベルのメッセージ* /
打印级别问题:
proc/sys/kernel$ ls printk
cat /proc/sys/kernel/printk
4 4 1 7
终端的级别 消息的默认级别 终端的最大级别 终端的最小级别
只有当消息的级别大于终端的级别的
时候,消息才会显示。
由于ubuntu的终端已经被开发者修改过了,所以
即使消息的级别大于控制台的级别,消息依然不会
显示,使用虚拟控制台才执行代码
ctrl +alt +[F1-F6] 进入虚拟终端
ctrl +alt + F7 退出虚拟终端
修改默认级别的办法:
su root
echo 4 3 1 7 > /proc/sys/kernel/printk
[9]カーネルモジュールのパラメーター転送の問題。
職場での開発時に画面ハードウェアを購入すると、
画面ドライバー(xxx.ko)が提供されます。たとえば、コマンドラインパラメーター転送を使用し
て画面のデフォルトの最大サイズを変更できます。輝度。
Standard types are:
byte, short, ushort, int, uint, long, ulong 注意:没有char类型!!
charp: a character pointer
bool: a bool, values 0/1, y/n, Y/N.
invbool: the above, only sense-reversed (N = true).
module_param(name, type, perm)
功能:接收命令行传的参数
参数:
@name:变量名
@type: 变量的类型
@perm: 权限 0664 0775
MODULE_PARM_DESC(_parm, desc)
功能:对命令行传递的参数进行描述
参数:
@_parm:变量
@desc:描述的字符串
安装驱动的时候传参:
sudo insmod demo.ko light=80
在运行的使用传参
/sys/module/驱动命名的目录/parameters/
以变量命名的文件
su root
echo 70 > light