리눅스 드라이버의 간단한 항목 - 연구 노트를 (1)

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

게시 65 개 원래 기사 · 원 찬양 107 · 전망 220 000 +

추천

출처blog.csdn.net/lang523493505/article/details/104265663