ARM驱动开发

驱动

以来内核编译,依赖内核执行

驱动可以同时执行多份代码

没main

驱动是依赖内核的框架和操作硬件的过程

一,Linux系统组成

app: 0-3G

---------------------------------系统调用(软中断)---------------------

kernel: 【3-4G】

5种功能:

进程管理:进程的创建、销毁、调度等功能

文件管理:通过文件系统ext2/ext3/ext4 yaff jiffs等来组织管理文件

网络管理 :通过网络协议栈对数据进程封装和拆解的过程

内存管理 :通过内存管理器对用户空间和内核空间内存的申请和释放

设备管理:设备驱动的管理

字符设备驱动:

  1. 按照字节为单位进行访问,顺序访问
  2. 会创建设备文件,open read write close来访问

块设备驱动:

  1. 按照块(512字节)(扇区)来访问,可以顺序访问,可以无序访问
  2. 会创建设备文件,open read write close来访问

网卡设备驱动:按照网络数据包来收发的

二,宏内核、微内核

宏内核:将进程、网络、文件、设备、内存等功能集成到内核中

优点:代码运行效率高 缺点:如果一个部分出错整个内核就崩溃了

eg: ubuntu Android

微内核:只将进程、内存机制集成到内核中,文件设备驱动等在操作系统之外运行

优点:稳定性强 缺点:效率低

eg:鸿蒙 window QNX

三,驱动模块

入口(安装):资源的申请

出口(卸载):资源的释放

许可证:GPL

cs 复制代码
#include <linux/init.h>
#include <linux/module.h>                                                                          
static int __init  hello_init(void) 
//__init将hello_in it放到.init.text段中
{
	return 0;
} 
static void __exit hello_exit(void)
		//__exit将hello_exit放到.exit.text段中
{
}
module_init(hello_init);
//告诉内核驱动的入口地址
module_exit(hello_exit);
//告诉内核驱动的出口地址
MODULE_LICENSE("GPL");
//许可证

Makefile:

KERNELDIR:= /lib/modules/$(shell uname -r)/build/

//内核的路径

#KERNELDIR:= /home/linux/kernel/kernel-3.4.39/

PWD:=$(shell pwd)

//驱动文件的路径

all: //目标

make -C (KERNELDIR) M=(PWD) modules

//进入内核目录下执行make modules这条命令

//如果不指定 M=$(PWD) 会把内核目录中的.c文件编译生成.ko

//M=$(PWD) 向编译模块的路径

clean:

make -C (KERNELDIR) M=(PWD) clean

obj-m:=hello.o //指定编译模块的名字

cs 复制代码
KERNELDIR:= /lib/modules/$(shell uname -r)/build/  
#KERNELDIR:= /home/linux/kernel/kernel-3.4.39/
PWD:=$(shell pwd)
all: 
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=hello.o 	

总结:

1、首先写个程序-》C语言程序-》.c

2、编译-》依靠内核编译( 开发板内核 和Ubuntu内核 (uname -r))

3、写Makefile-》找内核路径

4、当前文件的路径

5、all-》编译 make modules

  1. obj-m:=hello.o

四,内核的打印函数

printk(打印级别 "内容")->和printf用法类似-》区别多了个打印级别

printk(KERN_ERR "yxc")

include/linux/printk.h

打印等级:

#define KERN_EMERG "<0>" /* system is unusable */

#define KERN_ALERT "<1>" /* action must be taken immediately */

#define KERN_CRIT "<2>" /* critical conditions */

#define KERN_ERR "<3>" /* error conditions */

#define KERN_WARNING "<4>" /* warning conditions */

#define KERN_NOTICE "<5>" /* normal but significant condition */

#define KERN_INFO "<6>" /* informational */

#define KERN_DEBUG "<7>" /* debug-level messages */

0 ------ ------ 7

最高的 最低的

cat /proc/sys/kernel/printk(查看打印等级)

4 4 1 7

终端的级别 消息的默认级别 终端的最大级别 终端的最小级别

使用到的命令:

进入虚拟控制台 ctrl+alt+F1-F6

退出虚拟控制台 ctrl+alt+F7

sudo insmod hello.ko 安装驱动模块

sudo rmmod hello 卸载驱动模块

lsmod 查看模块 -》暂时没有使用

dmesg 查看消息

sudo dmesg -C 直接清空消息不回显

sudo dmesg -c 回显后清空

驱动安装完成以后更改变量方法:

lsmod查看驱动

找到路径:

/sys/module/驱动模块的名字/parameters$

/sys/module/hello/parameters$

进入su修改

su root

echo 123 > a

echo 10 > b

查看: cat a

相关推荐
艾伦_耶格宇几秒前
【AI】-4 OpenCode Go 接入 Obsidian 完整指南
运维·开发语言·人工智能·agent·opencode
旋生万物24 分钟前
【终极实战】用Python从零“生成“一个宇宙:螺旋干涉模型的代码实现
开发语言·前端·人工智能·react.js·php·wpf
16月6日-晴1 小时前
Java面向对象进阶—多态
java·开发语言
冯汉栩2 小时前
Swift Control RollingCountdownView(动画倒计时)
开发语言·ios·swift
lisanmengmeng2 小时前
搭建elk环境并接入frostmourne,实现监控报警效果(五)
开发语言·elk·日志·日志监控
Groundwork Explorer2 小时前
W5500 网卡编程初始化与使用指南
python·单片机
oh,huoyuyan2 小时前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
风流 少年2 小时前
hutool
java·服务器·开发语言
单片机仿真设计3 小时前
【proteus仿真】基于 STM32 的智能垃圾桶设计(仿真图+程序)
c语言·stm32·stm32单片机·proteus·毕设·仿真
一木 之林3 小时前
四、STL容器与数据结构
开发语言·数据结构·c++