PCのオペレーティング・システム:Ubuntuの16.04 LTS
コンパイラ:腕-poky-linuxの-gnueabi -gcc 4.9.1
Linuxプラットフォームのi.mx6ドライブモジュールのマイナーな変化に基づくので、一貫した、それの時間がゼロから自分自身を整理することではない多くの情報が知識の気持ちをオフにチェックする時間となっています。
まず、最小駆動モジュールのテンプレートを作成します
ファイルのhello.cを作成します。
#include<linux/init.h>
#include<linux/module.h>
/*************************************************************************************************/
// 局部宏定义
/*************************************************************************************************/
#define EN_DEBUG 1 /* 调试信息开关 */
#if EN_DEBUG
#define PRINT(x...) printk(KERN_EMERG x) /* 提高打印等级 */
#else
#define PRINT(x...)
#endif
/**************************************************************************************************
** 函数名称: drv_init
** 功能: 驱动初始化函数,在加载时被调用
** 参数: 无
** 返回: 无
**************************************************************************************************/
static int __init drv_init(void)
{
PRINT("%s ------ \n", __FUNCTION__);
return 0;
}
/**************************************************************************************************
** 函数名称: drv_exit
** 功能描述: i2c驱动退出函数,在卸载时被调用
** 参数: 无
** 返回: 无
**************************************************************************************************/
static void __exit drv_exit(void)
{
PRINT("%s ------ \n", __FUNCTION__);
}
module_init(drv_init); /* 模块初始化 */
module_exit(drv_exit); /* 模块卸载 */
MODULE_AUTHOR("hrx"); /* 模块作者 */
MODULE_DESCRIPTION("Linux Driver"); /* 模块描述 */
MODULE_VERSION("1.0.0"); /* 模块版本 */
MODULE_LICENSE("GPL"); /* 模块遵守的License */
モジュールは、機能を実装します
- ロード機能
- アンインストール機能
- 作者、説明、バージョン、権限などを説明
- プリントデバッグ情報(のprintk)
説明デバッグを印刷
- ユーザーはprintfの層を使用することができます
- prink機能を使用してLinuxカーネル層
- でprink KERN_EMERGマクロに出力レベルを(私はこの出力レベルは、デバッグ情報を直接出力することができる選択した)を設定することで、より多くの定義されたカーネル\ \ Linuxの\ kern_levels.hとしてファイルを見ることができます。
- レベルが高くない場合は、あなたもすることができ、出力を印刷することはできません-c dmesgの出力キャッシュ印刷情報のコマンドを(-cは、出力後にキャッシュを空にすることです)。
第二に、書き込みのMakefile
#当前目录路径
PWD = $(shell pwd)
#Linux内核根目录路径
KERNEL_DIR = $(PWD)/../../kernel
#驱动名称
DRVNAME = hello
#obj-m选项是会以模块进行编译,不会被编译进内核,而是独立生成一个.ko文件
#obj-y选项是会被编译进内核
obj-m += hello.o
build:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD)
clean:
@rm -rf *.o *.ko .*.cmd *.mod.c *.order *.symvers .tmp_versions *~
説明
- KERNEL_DIRは、現在のディレクトリパスカーネルのMakefileに相対的です。
- ** $(MAKE)**定義されたマクロは、(ここでは、私が唯一作る)他のパラメータを含むことができる、コマンドを作ります。
- -Cザ・はに切り替えるために、Cを大文字KERNEL_DIRの作成、ディレクトリ。
- ** M = **指定されたディレクトリのLinuxドライバのソースコードが配置されています。
第三に、世代のドライバファイル(*の.ko)
1.設定クロスコンパイラ環境
私は、クロスコンパイラに、開発ボードを使用しておりますので。
参考:設定imx6クロスコンパイラ環境
2、コンパイル
.koファイルを生成するために、makeコマンドを発行します。
make build
第四に、ロードとアンロードドライバ
まず最初hello.koのスプレッド開発ボードは、後続の操作を実行します。
図1に示すように、ドライバ(insmodの)をロード
root@imx6qsabresd:/tmp# insmod hello.ko
[ 7707.518557] drv_init ------
この出力初期化関数。
2、ドライバアンインストール(rmmodは)
root@imx6qsabresd:/tmp# rmmod hello.ko
[ 7843.203066] drv_exit ------
この出力終了。
ビュードライブ情報への第五に、
図1に示すように、ロードされたモジュールのリストドライブ(lsmodの)
root@imx6qsabresd:/tmp# lsmod
Tainted: G
hello 832 0 - Live 0x7f057000 (O)
lsmodのは、実際に私は、コンテンツ** / procの/モジュール**ファイルを読みます
root@imx6qsabresd:/tmp# cat /proc/modules
hello 832 0 - Live 0x7f057000 (O)
図2に示すように、格納位置の駆動負荷情報
走行後にロードされます/ SYS /モジュール/駆動負荷情報内に格納されたディレクトリのドライブフォルダと同じ名前のファイルが生成されます。
root@imx6qsabresd:/tmp# ls -l /sys/module/hello/
-r--r--r-- 1 root root 4096 Nov 10 19:40 coresize
drwxr-xr-x 2 root root 0 Nov 10 19:40 holders
-r--r--r-- 1 root root 4096 Nov 10 19:40 initsize
-r--r--r-- 1 root root 4096 Nov 10 19:40 initstate
drwxr-xr-x 2 root root 0 Nov 10 19:40 notes
-r--r--r-- 1 root root 4096 Nov 10 19:40 refcnt
drwxr-xr-x 2 root root 0 Nov 10 19:40 sections
-r--r--r-- 1 root root 4096 Nov 10 19:40 srcversion
-r--r--r-- 1 root root 4096 Nov 10 19:40 taint
--w------- 1 root root 4096 Nov 10 19:35 uevent
図3に示すように、ビュー・ドライブ情報ファイル(のmodinfo)
- ドライブを直接問い合わせるこのコマンドファイルは、あなたがロードする必要はありません。
- 開発ボードは、PC上で表示したファイルの情報を駆動して、このコマンドを、去勢します。
- 説明作成者、説明、バージョン、権限および他の以前にドライバファイルに定義されているが、これを取得することができます。
hrx@@@:~/Imx6/platform/driver/hello$ modinfo hello.ko
filename: /home/hrx/Imx6/platform/driver/hello/hello.ko
license: GPL
version: 1.0.0
description: Linux Driver
author: hrx
srcversion: A5F2F4E32D4DF79D5CF15B7
depends:
vermagic: 3.14.38-6UL_ga-svn12810 SMP preempt mod_unload modversions ARMv7 p2v8
参考1:HTTPS://blog.csdn.net/leon1741/article/details/78165507