input子系统
input子系统定义input子系统是linux内核针对某一类型的设备而创建的,比如键盘、鼠标、触摸屏、手柄等。input子系统分为以下几部分:input驱动层,input核心层,input事件层。
上图中,最左边的就是具体的设备,这个不用管。中间部分就是我们要关注的input驱动层,input核心层,input事件层。驱动层:输入设备的具体驱动程序,比如按键驱动程序,向内核层报告输入内容。核心层:承上启下,为驱动层提供输入设备注册和操作接口。通知事件层对输入事件进行处理。事件层:主要和用户空间进行交互。
drivers/input/input.c
123register_chrdev_region(MKDEV(INPUT_MAJOR, 0), INPUT_MAX_CHAR_DEVICES, "input");
这个文件中注册了一个类,设备号是13
输入设备注册在使用 input 子系统的时候我们只需要注册一个 input 设备即可,input_dev 结构体表示 input设备,此结构体定义在 include/lin ...
linux中断
linux中断1、硬件中断1-1、Linux内核中断API以下是Linux内核中断处理相关的API
1-1-1、中断处理函数注册和注销12int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);void free_irq(unsigned int irq, void *dev);
request_irq
参数:
unsigned int irq: 中断号。
irq_handler_t handler: 中断处理函数指针。
unsigned long flags: 中断标志(如IRQF_SHARED表示共享中断线)。
const char *name: 中断处理程序的名称,用于调试。
void *dev: 设备标识符,通常为设备结构体。
返回值:
0: 成功注册。
非零值: 注册失败。
free_irq
参数:
unsigned int irq: 中断号。
void *dev: 设备标识符,必须与注册时一致。
...
linux内核定时器
定时器1、内核config配置配置内核定时器步骤
12->kernel Features ->timer frequency (<choice> [=y])
在里面可以选择系统的节拍数,默认是1000Hz,也就是1ms节拍,如果选择2000Hz,就是0.5ms节拍,如果选择10000Hz,就是0.1ms节拍。配置完成后,在源码中的.config文件中,会自动生成如下配置:
1CONFIG_HZ=1000
这个就是节拍率。
这个配置生效在:include/asm-generic/param.h中
1234567891011#ifndef __ASM_GENERIC_PARAM_H#define __ASM_GENERIC_PARAM_H#include <uapi/asm-generic/param.h># undef HZ# define HZ CONFIG_HZ /* Internal kernel timer frequency */# define USER_HZ 100 /* some user inte ...
内核4.8后与4.8之前的gpio差异
在 Linux 内核中,有专门用于控制 GPIO(General - Purpose Input/Output,通用输入输出)输出的函数。
4.8 之前的内核在较旧的 Linux 内核版本中,使用的是传统的 GPIO 接口。相关函数主要定义在 <linux/gpio.h> 头文件中。
1、请求GPIO在使用 GPIO 之前,需要先请求该 GPIO 资源,以确保不会与其他驱动冲突。
123#include <linux/gpio.h>int gpio_request(unsigned gpio, const char *label);
2、设置GPIO方向输出1int gpio_direction_output(unsigned gpio, int value);
gpio:要设置的 GPIO 编号。
value:初始输出电平,0 表示低电平,1 表示高电平。返回值:成功时返回 0,失败时返回负数错误码。
3、设置 GPIO 输出电平1void gpio_set_value(unsigned gpio, int value);
gpio: ...
字符内核驱动框架
需要重点掌握的的函数:物理内存映射到虚拟空间后,在内核使用ioremap进行映射,在用户空间使用mmap进行映射。
ioremap函数与readl,readb,readw,readq,writel,writeb,writew,函数配合使用
1、字符型设备框架–旧相关函数:
12345678910111213retvalue = register_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME, &chrdevbase_fops);unregister_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME);copy_to_user(.....);copy_from_user(.....);module_init(chrdevbase_init);module_exit(chrdevbase_exit);/* * LICENSE和作者信息 */MODULE_LICENSE("GPL");MODULE_AUTHOR("ygc");
1-1、旧字符框架123456789101112 ...
mount -a
mount -amount -a 命令用于挂载所有未挂载的已注册文件系统。扫描的文件来自fstable文件,没有这个,系统将不能正常工作。
创建fstable文件1234#<file system> <mount point> <type> <options> <dump> <pass>proc /proc proc defaults 0 0tmpfs /tmp tmpfs defaults 0 0sysfs /sys sysfs defaults 0 0
nfs挂载跟文件系统
nfs挂载第一种方法(用于调试,会跳过引导,导致不会执行rs文件)1setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.8.217:/home/ygc/Desktop/project/nfs/rootfs,rw,nfsvers=3,proto=tcp ip=192.168.8.120:192.168.8.217:192.168.8.1:255.255.255.0::eth0:off init=/bin/sh nfsdebug=7'
nfs挂载第二种方法(用于生产)1setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.8.217:/home/ygc/Desktop/project/nfs/rootfs,rw,sync,nfsvers=3,proto=tcp ip=192.168.8.120:192.168.8.217:192.168.8.1:255.255.255.0::eth0:o ...
mx6ull编译器选择
mx6ull编译器选择https://github.com/nxp-imxnxp官方维护的仓库
属于arm架构,armv7a系类。支持硬件浮点运算。需要系统。可选的编译器:在Linaro官网下载交叉编译工具链:https://www.linaro.org/downloads/arm官方的:https://developer.arm.com/downloads/-/gnu-a
编译器命名规则:编译器的命名除了反映基本的架构、ABI、操作系统等信息外,还可以包含更多细节,比如是否支持系统调用、硬件特性、运行模式等。以下是更完整的命名规则和含义.
编译器命名的关键组成部分:
目标架构(Architecture):
表示该编译器生成的代码是为哪种 CPU 架构设计的。
示例:arm 表示 32 位 ARM 架构(ARMv7-A 属于这一类);aarch64 表示 64 位 ARM 架构。
子架构或指令集特性(Optional Sub-Architecture / Features):
可能包含如 v7a、v5t、neon 等,表示支持的指令集扩展。
示例:armv7a-lin ...
无题
先确定驱动一般在配置文件中先找,假设找到那么就搜索找到摄像头驱动,如果没有找到,那么就需要询问厂家。编译好之后,发送开发板
修改设备树
rootfs移植-详细
主要介绍做中文支持和启动内核后的init脚本
有关于启动的脚本提前在这里说明:
1setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.8.217:/home/ygc/Desktop/project/nfs/rootfs,rw,nfsvers=3,proto=tcp ip=192.168.8.120:192.168.8.217:192.168.8.1:255.255.255.0::eth0:off init=/bin/sh nfsdebug=7'
初始化脚本 init= 什么可以不指定,就可以让系统判断。
1、下载源码,官网下载比较简单,略
1-1、添加中文支持printable_string.c中将下面删除
12if (c >= 0x7f) break;
往下找下面
1234break; if (c < ' ' || c >= 0x7f) *d = '?'; d++;
改为
1234break; if ( ...











