PC 운영 체제 : 우분투 16.04 LTS
컴파일러 : 팔 비좁은 - 리눅스 - gnueabi -gcc 4.9.1
리눅스 플랫폼 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 계층을 사용할 수 있습니다
- 모양을 내다 기능을 사용하여 리눅스 커널 층
- 모양을 내다에 KERN_EMERG 매크로 출력 레벨 (나는이 출력 레벨이 직접 출력 디버깅 정보가 될 수 선택) 설정하는 것입니다, 더 많은 정의 커널 \ \ 리눅스 \ kern_levels.h 포함 파일을 볼 수 있습니다.
- 수준이 높지 않은 경우에, 당신도 할 수 출력을 인쇄 할 수 없습니다 -c dmesg를 출력 캐싱 인쇄 정보 명령 (-c 출력 후 캐시를 비우는 것입니다).
둘째, 쓰기 메이크
#当前目录路径
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 = ** 지정된 디렉토리 리눅스 드라이버 소스 코드가 있습니다.
셋째, 세대 드라이버 파일 (* .ko)
1. 구성 크로스 컴파일러 환경
내가 개발 보드를 사용하고 있기 때문에, 그래서 컴파일러를 교차합니다.
참조 : 구성 imx6 크로스 컴파일러 환경
2, 컴파일
.ko 파일을 생성하는 make 명령을 실행하십시오.
make build
넷째, 로딩 및 언 로딩 드라이버
먼저 첫 번째 hello.ko의 확산 개발 보드는 후속 작업을 수행 할 수 있습니다.
1 드라이버 (올릴때)을로드
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