
嵌入式开发
文章平均质量分 83
4IOT
这个作者很懒,什么都没留下…
展开
-
lv15 input子系统框架、外设驱动开发 5
在我们日常的Linux系统中,存在大量的输入设备,例如按键、鼠标、键盘、触摸屏、摇杆等,他们本身就是字符设备,linux内核将这些字符设备的共同性抽象出来,简化驱动开发建立了一个input子系统。Linux内核为了两个目的:简化纯输入类外设(如:键盘、鼠标、游戏杆、轨迹球、触摸屏。。。等等)的驱动开发统一输入类外设产生的数据格式(struct input_event),更加方便应用层编程设计了输入子系统框架。原创 2024-02-18 22:37:15 · 1163 阅读 · 0 评论 -
lv15 I2C背景知识(裸机I2C、linux对I2C支持、MPU6050)4
SOC芯片平台的外设分为:一级外设:外设控制器集成在SOC芯片内部二级外设:外设控制器由另一块芯片负责,通过一些通讯总线与SOC芯片相连Inter-Integrated Circuit: 字面意思是用于“集成电路之间”的通信总线,简写:IIC(或者I2C)一般空闲态都会让SCL与SDA处于低电平。i2c传输的要点就是: 传输一个字节 后面必然紧跟一个"响应"信号----应答信号.这个响应信号可能来自主机,或者是从机,具体是谁,就要看传输方向。原创 2024-02-17 21:19:36 · 1200 阅读 · 0 评论 -
lv15 平台总线驱动开发——ID匹配 3
device模块中,id的name成员必须与struct platform_device中的name成员内容一致,因此device模块中,设备树匹配:内核启动时根据设备树自动产生的设备 ------ 优先级最高(大部分设备的方法)id_table可不设置,但struct platform_driver成员driver的。改写leddrv_dt.c为fs4412_led_driver_treecmatch.c。driver模块中,struct platform_driver成员。------优先级次低(原创 2024-02-14 21:45:53 · 685 阅读 · 0 评论 -
lv15 平台总线框架及案例 2
在计算机中有这样一类设备,它们通过各自的设备控制器,直接和CPU连接,CPU可以通过常规的寻址操作访问它们(或者说访问它们的控制器)。这种连接方式,并不属于传统意义上的总线连接。只要任何Device和Device Driver具有相同的名字,内核就会执行Device Driver结构中的初始化函数(probe),该函数会初始化设备,使其为可用状态。启动某一个设备前,内核会检查该设备是否依赖其它设备或者总线,如果依赖,则检查所依赖的对象是否已经启动,如果没有,则会先启动它们,直到启动该设备的条件具备为止。原创 2024-02-13 21:29:39 · 929 阅读 · 0 评论 -
lv15 驱动高级设备模型 1
之前的驱动操作称为硬编。原创 2024-02-12 16:11:15 · 896 阅读 · 0 评论 -
lv14 中断上半部与下半部 15
前言:为了解决处理中断处理程序时间过长的问题如果一个中断处理程序的执行时间超过1分钟,那么对用户来说非常不友好。处理方式:起源:中断处理程序执行时间过长引起的问题有些设备的中断处理程序必须要处理一些耗时操作6.2 定义tasklet的中断底半部处理函数6.3 初始化tasklet内核定义的宏,一般很少用,常用下面的初始化函数6.4 调度tasklet一般在上半部的最后调用三、按键驱动之tasklet版目的:按键程序一般不需要tasklet,借用按键中断处理来熟悉原创 2024-02-11 23:02:10 · 431 阅读 · 0 评论 -
lv14 中断处理原理:接口及按键驱动 14
一种硬件上的通知机制,用来通知CPU发生了某种需要立即处理的事件分为:内部中断 CPU执行程序的过程中,发生的一些硬件出错、运算出错事件(如分母为0、溢出等等),不可屏蔽外部中断 外设发生某种情况,通过一个引脚的高、低电平变化来通知CPU (如外设产生了数据、某种处理完毕等等)原创 2024-02-11 21:11:54 · 533 阅读 · 0 评论 -
lv14 led驱动设备树版本 13
led驱动代码中无法给其他开发板重用,编程依据不清晰把编程依据写到设备树中。原创 2024-02-10 18:19:38 · 912 阅读 · 0 评论 -
lv14 内核内存管理、动态分频及IO访问 12
内核将物理内存等分成N块4KB,称之为一页,每页都用一个struct page来表示,采用伙伴关系算法维护Linux内存管理采用了虚拟内存机制,这个机制可以在内存有限的情况下提供更多可用的内存空间。当应用程序需要访问某些数据时,它会使用虚拟地址来引用这些数据。实际上,这些虚拟地址并不是直接映射到物理内存,而是由操作系统进行转换。操作系统将虚拟地址映射到物理内存中的一些页框(Page Frame),这个过程称为页表映射(Page Table Mapping)。原创 2024-01-27 23:38:27 · 1088 阅读 · 0 评论 -
lv14 内核定时器 11
硬件有一个时钟装置,该装置每隔一定时间发出一个时钟中断(称为一次时钟嘀嗒-tick),对应的中断处理程序就将全局变量jiffies_64加1jiffies_64 是一个全局64位整型, jiffies全局变量为其低32位的全局变量,程序中一般用jiffiesHZ:可配置的宏,表示1秒钟产生的时钟中断次数,一般设为100或200。原创 2024-01-21 20:22:56 · 982 阅读 · 0 评论 -
lv14 信号量、互斥锁、并发控制机制选择
a.定义信号量b.初始化信号量c.获得信号量Pd.释放信号量V适用场合:任务上下文之间且临界区执行时间较长时的互斥或同步问题注意:pv操作成对出现。原创 2024-01-20 22:40:08 · 991 阅读 · 0 评论 -
lv14 并发控制:上下文、中断屏蔽和原子变量
多任务并行执行时,如果在一个时刻同时操作同一个资源,会引起资源的错乱,这种错乱情形被称为竞态。为了解决竞态,需要提供一种控制机制,来避免在同一时刻使用共享资源,这种机制被称为。适用场合:中断上下文与某任务共享资源时,或多个不同优先级的中断上下文间共享资源时。执行打开两个终端去打开设备:终端1打开了,终端2无法重复打开。ctrl+c结束第一个程序后,终端1关闭,终端2可以打开。插入内核模块,查看系统中已注册的设备类型,添加字符设备。当打开操作时,如果能打开自减1,不能打开返回错误。原创 2024-01-15 19:27:01 · 971 阅读 · 0 评论 -
lv14 多路复用及信号驱动 8
描述符:文件描述符:设备文件、管道文件socket描述符。原创 2024-01-14 18:50:05 · 493 阅读 · 0 评论 -
lv14 IO模型:阻塞和非阻塞 7
open时由O_NONBLOCK指示read、write时是否阻塞。非阻塞:不能操作就返回错误(通过轮询即才能实现阻塞的情况 )信号驱动:让内核如果能操作时发信号,在信号处理函数中操作。异步IO:向内核注册操作请求,内核完成操作后发通知信号。阻塞: 不能操作就睡觉。多路复用:委托中介监控。驱动层:通过等待队列。原创 2024-01-08 22:36:34 · 496 阅读 · 0 评论 -
lv14 ioctl、printk及多个此设备支持 6
对相应设备做指定的控制操作(各种属性的设置获取等等)cmd组成dir(direction),ioctl 命令访问模式(属性数据传输方向),占据 2 bit,可以为IOC_NONE、IOC_READ、IOC_WRITE、IOC_READ | _IOC_WRITE,分别指示了四种访问模式:无数据、读数据、写数据、读写数据;原创 2024-01-07 18:37:51 · 530 阅读 · 0 评论 -
lv 14 字符设备读写操作实现 5
x:char、int类型的简单变量名成功为返回0,失败非0。原创 2024-01-05 20:55:29 · 453 阅读 · 0 评论 -
lv14 字符设备驱动基础框架解析 4
设备的操作函数如果比喻是桩的话(性质类似于设备操作函数的函数,在一些场合被称为桩函数),则:驱动实现设备操作函数 ----------- 做桩insmod调用的init函数主要作用 --------- 钉桩rmmod调用的exitt函数主要作用 --------- 拔桩应用层通过系统调用函数间接调用这些设备操作函数 ------- 用桩。原创 2024-01-03 21:25:34 · 525 阅读 · 0 评论 -
lv14 注册字符设备 3
直接定义:定义结构体全局变量。原创 2024-01-01 20:47:17 · 943 阅读 · 0 评论 -
lv14 函数指针复习 2
内存的作用-----用来存放程序运行过程中的数据指令。原创 2024-01-01 11:41:12 · 451 阅读 · 0 评论 -
lv14 设备分类、设备号申请和注销 1
块设备:按整块进行数据读写的设备,最小的块大小为512字节(一个扇区),块的大小必须是扇区的整数倍,Linux系统的块大小一般为4096字节,随机访问,设缓存以提高效率。分配成功后在/proc/devices 可以查看到申请到主设备号和对应的设备名,mknod时参数可以参考查到的此设备信息。字符设备:按字节流形式进行数据读写的设备,一般情况下按顺序访问,数据量不大,一般不设缓存。应用程序打开一个设备文件时,通过设备号来查找定位内核中管理的设备。示例:创建一个主设备号289、副设备号0的字符设备。原创 2023-12-31 19:35:46 · 954 阅读 · 0 评论 -
lv13 内核与用户空间
为了彻底解决一个应用程序出错不影响系统和其它app的运行,操作系统给每个app一个独立的假想的地址空间,这个假想的地址空间被称为虚拟地址空间(也叫逻辑地址),操作系统也占用其中固定的一部分,32位Linux的虚拟地址空间大小为4G,并将其划分两部分:0~3G 用户空间:每个应用程序只能使用自己的这份虚拟地址空间3G~4G 内核空间:内核使用的虚拟地址空间,应用程序不能直接使用这份地址空间,但可以通过一些系统调用函数与其中的某些空间进行数据通信实际内存操作时,需要。原创 2023-12-30 23:43:41 · 535 阅读 · 0 评论 -
lv13 内核模块参数和依赖
将指定的全局变量设置成模块参数注:perm变量名操作权限一般都设置为0664,对应110(用户可读写),110(组可读写 100,(其他用户可读)。若是数组变量,存放数组大小变量的地址,可以填NULL(确保传参个数不越界)。1.2 示例:修改MakeFile编译运行带参数编译运行用法:用参数控制内核某个功能是否执行。原创 2023-12-30 23:00:34 · 1129 阅读 · 0 评论 -
lv13 内核模板编译方法 7
类似于浏览器、eclipse这些软件的插件开发,Linux提供了一种可以向正在运行的内核中插入新的代码段、在代码段不需要继续运行时也可以从内核中移除的机制,这个可以被插入、移除的代码段被称为内核模块。单内核扩展性差的缺点减小内核镜像文件体积,一定程度上节省内存资源提高开发效率不能彻底解决稳定性低的缺点:内核模块代码出错可能会导致整个系统崩溃:一段隶属于内核的“动态”代码,与其它内核代码是同一个运行实体,共用同一套运行资源,只是存在形式上是独立的。原创 2023-12-29 23:03:43 · 487 阅读 · 0 评论 -
lv13 内核模块动态添加新功能 6
即新功能源码与内核其它源码不一起编译,而是独立编译成内核的插件(被称为内核模块)文件.ko。原创 2023-12-28 22:46:30 · 529 阅读 · 0 评论 -
lv13 内核模块静态添加功能 5
make menuconfig 界面里将新功能对应的那项选择成即新功能源码与内核其它代码一起编译进uImage文件内。新功能源码与Linux内核源码在同一目录结构下。启动开发板观察串口终端中的打印信息。给新功能代码改写Makefile。给新功能代码配置Kconfig。原创 2023-12-26 21:57:15 · 1012 阅读 · 0 评论 -
lv13 环境搭建之内核编译 4
【代码】lv13 环境搭建之内核编译 4。原创 2023-12-25 22:34:12 · 474 阅读 · 0 评论 -
lv13 环境搭建SD卡启动 3
一、准备好烧录脚本二、将SD卡插入USB读卡器,并连接到虚拟机或者一般识别的sd卡会在dev目录下显示sdb三、烧录。原创 2023-12-24 13:36:44 · 572 阅读 · 0 评论 -
lv13 环境搭建 2
开机运行的第一个裸机程序被称为bootloader,主要负责:加载内核可执行文件到内存运行给待运行的内核准备好启动参数加载二进制设备树文件到内存安装系统u-boot是一个开源的bootloader程序,u-boot-fs4412.bin由其源码编译生成,详情见《系统移植之u-boot移植》课程。原创 2023-12-24 10:08:55 · 446 阅读 · 0 评论 -
lv13 操作系统、内核实现 1
狭义的操作系统:给应用程序提供运行环境的裸机程序,也被称为操作系统内核广义的操作系统:一组软件集合,它包含:最核心的一个裸机程序 ----------内核 (kernel)app开发常用的一些功能库(如:C语言标准函数库、线程库、C++标准类库、QT类库等等)一些管理用的特殊app(如桌面、命令行、app包管理器、资源管理器、系统设置、一些常用后台服务程序)英文:Device Driver简称:驱动(Driver)原创 2023-12-23 15:44:10 · 537 阅读 · 0 评论 -
lv12 根文件系统12
编译rootfs原创 2023-12-23 00:09:05 · 1419 阅读 · 0 评论 -
lv12 linux设备树、网卡驱动移植
设备树是一种描述硬件信息的数据结构,Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核,而不再需要在Linux内核中包含大量的冗余编码。驱动负责逻辑、设备树负责操作寄存器,把两者分开管理移植到其他芯片的时候驱动逻辑不需要变更,只需要修改设备树即可,同时可以使得内核源码大小精简。设备树的语法为树状结构,由一系列的节点和属性组成,根节点下包含子节点 子节点下还可以包含子节点,节点内部包含了对应设备的属性。dtsi 类似于头文件,包含一些公共的信息,可被其它设备树文件引用。原创 2023-12-21 23:40:07 · 1224 阅读 · 0 评论 -
lv12 linux 内核移植 10
内核是一个操作系统的核心,提供了操作系统最基本的功能,是操作系统工作的基础,决定着整个系统的性能和稳定性操作系统是在内核的基础上添加了各种工具集、桌面管理器、库、shell、应用程序等常用shell命令都在bin目录下,即是可执行文件,属于ubuntu系统不属于内核开发板虽然没有ubuntu操作系统,但是也可以使用这些命令,都放在根文件系统下面。原创 2023-12-19 23:05:29 · 1448 阅读 · 0 评论 -
lv12 uboot移植深化 9
1 建立自己的平台【实验目的】了解u-boot的代码结构及移植的基本方法【实验环境】ubuntu14.04发行版FS4412实验平台交叉编译工具注意事项实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行【实验步骤】1 建立自己的平台1.1 下载uboot源码在uboot官网下载uboot源码(这里我们选择u-boot-2013.01.tar.bz21.2解压uboot源码。原创 2023-12-16 22:05:20 · 875 阅读 · 0 评论 -
lv12 uboot源码配置编译 8
不过找不到我们的开发板,不可能把所有公司的开发板都包含,主要是评估板,我们可以在官方评估板origen中修改即可使用,(找官方与4412相关的)即与CPU架构或开发板硬件相关的源码,硬件的改动对应的代码也需要进行修改。注2:该命令执行后在uboot源码顶层目录下生成u-boot.bin。可以删除生成的.o的中间文件删除,但是最终u-boot不会删除。注1:该命令必须在uboot源码的顶层目录下执行。注1:该命令必须在uboot源码的顶层目录下执行。前期:uboot-1.2.3。为当前使用的开发板的名字。原创 2023-12-16 17:18:00 · 875 阅读 · 0 评论 -
lv12 交叉编译工具链 7
主要介绍2个,其余可以自己看把elf文件转换未bin文件,因为elf文件需要运行在linux之上。原理即把代码段数据段的内容提取出来即为bin文件。把许多段,使用gap-fill 填充为0xff即可。原创 2023-12-16 15:57:22 · 982 阅读 · 0 评论 -
lv12 linux内核的安装与加载 6
系统脱离SD卡的启动方式sd默认是第1块启动,第0块是分区表,但是emmc不一样,默认是第0块启动。原创 2023-12-16 00:46:54 · 1231 阅读 · 0 评论 -
lv12 uboot概述即SD卡制作 5
在操作系统运行之前运行的一小段代码,用于将软硬件环境初始化到 一个合适的状态,为操作系统的加载和运行做准备(其本身不是操作系统)BL0把SD卡里的内容复制到内存里面运行,因为直接在SD(uboot)里是无法运行的,属于外设。把外存里的rootf、dtb、linux搬到内存(这些都安装在外存)嵌入式linux常用的bootloader是uboot。, 之后的空间根据个人需求可进行分区和格式化。,后续的扇区可自行分区和格式化;uboot开始运行,初始化软硬件环境。SD卡的存储以扇区为单位,原创 2023-12-13 22:34:15 · 442 阅读 · 0 评论 -
lv12 uboot使用 4
uboot启动后若没有用户介入,倒计时结束后会自动执行自启动 环境变量(bootcmd)中设置的命令(一般作加载和启动内核)倒计时结束之前按下任意按键uboot会进入交互模式,交互模式下 用户可输入uboot命令。原创 2023-12-12 23:56:02 · 501 阅读 · 0 评论 -
lv12 交叉开发环境搭建 3
目的:让Ubuntu可以上外网,让开发板可以与ubuntu互通。原创 2023-12-11 23:14:23 · 530 阅读 · 0 评论 -
lv12 开发板启动过程 2
对于arm来说,不是给它多大的内存都能读。寻址空间(地址空间)读写范围是有限的,寻址空间的大小与地址总线宽度有关,如32位,地址空间4G(2^32)。4412的CPU在工作的时需要读写内存,还需要控制硬件,读取寄存器,所以需要规范这4G的空间。上电PC为0,0地址执行了IROM,内部三星公司写入了BL0(即boot load 0)IRAM是内部的内存SFR是特殊功能寄存器最后3G 外扩内存(我们开发板上的内存1G,地址是0x40000000-0x80000000)原创 2023-12-10 23:34:05 · 503 阅读 · 0 评论