- 博客(192)
- 资源 (4)
- 收藏
- 关注
原创 富瀚MC632X jffs2文件系统制作
根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文 件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载 (mount。目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否需要配置文件。文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。中的文件应该是 只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如/var。
2024-11-08 16:09:01 998
原创 LINUX底层命令sed
sed -i 'Nc 替换内容' filename //替换第N行内容。一般在底层要替换某内容,很少打开该文件确认位置再用这个命令。替换一个文件中的部分内容。
2024-11-01 09:12:00 252
原创 LINUX I2C适配器驱动编写
i2c_imx_start、i2c_imx_read、i2c_imx_write 和 i2c_imx_stop 这些函数就是 I2C 寄存器的具 体操作函数。当设备和驱动匹配成功以后 i2c_imx_probe 函数就会执行,i2c_imx_probe 函数 就会完成 I2C 适配器初始化工作。第 1008~1013 行,imx_i2c_struct 结构体要有个叫做 adapter 的成员变量,adapter 就是 i2c_adapter,这里初始化i2c_adapter。
2024-10-30 16:07:25 771
原创 LINUX IIC总线驱动-设备框架
IMX6ULL裸机篇中编写传感器AP3216C 驱动的时候,我们编写了四个文件:bsp_i2c.c、 bsp_i2c.h、bsp_ap3216c.c 和 bsp_ap3216c.h。编写IIC控制器驱动,bsp_i2c.c和bsp_i2c.h为IIC外设驱动。向外提供i2c_master_transfer函数;bsp_3216c.c和bsp_3216c.h为IIC设备驱动。其中前两个是 I.MX6U 的 IIC 接口驱动,后两个文 件是 AP3216C 这个 I2C 设备驱动文件。
2024-10-30 15:11:50 1248
原创 DDR内存和Flash内存
NAND 闪存的存储单元则采用串行结构,存储单元的读写是以页和块为单位来进行(一页包含若干字节,若干页则组成储存块, NAND 的存储块大小为 8 到 32KB ),这种结构最大的优点在于容量可以做得很大,超过 512MB 容量的 NAND 产品相当普遍, NAND 闪存的成本较低,有利于大规模普及。由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。通常称为闪存,也是内存器件的一种。
2024-10-29 11:43:13 348
原创 LINUX总线-设备-驱动匹配
根据总线-驱动-设备驱动模型,IIC、SPI、USB这样实实在在的总线是完全匹配的,但是要有一些外设是没法归结为具体的总线:比如定时器、RTC、LCD等。为此linux内核创造了一个虚拟的总线:platform总线。根据驱动的分离与分层衍生出了总线(bus)-驱动(driver)-设备(device)驱动框架。设备:设备属性,包括地址范围、如果是IIC的话还有IIC器件地址、速度......总线代码我们不需要编写,linux内核提供给我们使用的。向总线注册设备的时候,使用。驱动:是具体的设备驱动。
2024-10-29 09:36:51 620
原创 GB28181信令交互和推流代码实现
其中,信令1、8、9、10、11、12为SIP服务器接收到客户端的呼叫请求后通过 B2BUA 代理方式建立 媒体流接收者与媒体服务器之间的媒体流信令过程,信令2~7为SIP服务器通过三方呼叫控制建立媒 体服务器与媒体流发送者之间的媒体流信令过程,信令13~16为媒体流接收者断开与媒体服务器之间 的媒体流信令过程,信令17~20为 SIP 服务器断开媒体服务器与媒体流发送者之间的媒体流信令过程。19:SIP 服务器向媒体流发送者发送 BYE 消息,断开消息4、5、7建立的同媒体流发送者的Invite会话。
2024-10-28 09:51:08 1103
原创 strcat函数追加字符串
使用strcat函数给目标字符串追加字符时,首先要找到目标字符串中'\0'的位置,然后在'\0'的位置上向后追加源字符串。源字符串src是从目标字符串src中的'\0'位置开始追加的,同时源字符串sdest中的'\0'也一并追加了过去。
2024-10-22 10:28:21 213
原创 LINUX内核驱动-总线-设备模型
match 函数很重要,单词 match 的意思就是“匹配、相配”,因此此函数就是完成设备和驱动之间匹配的,总线就是使用 match 函数来根据注册的设备来查找对应的驱动,或者根据注册的驱动来查找相应的设备,因此每一条总线都必须实现此函数match 函数有两个参数: dev 和 drv,这两个参数分别为 device 和 device_driver 类型,也就是设备和驱动。name 表示设备名字,要和所使用的 platform 驱动的 name 字段相同,否则的话设备就无法匹配到对应的驱动。
2024-10-22 08:56:45 779
原创 LINUX内核驱动异步机制
我们首先来回顾一下“中断”,中断是处理器提供的一种异步机制,我们配置好中断以后就可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数,在中断服务函数中做具体的处理。Linux 应用程序可以通过阻塞或者非阻塞这两种方式来访问驱动设备,通过阻塞方式访问的话应用程序会处于休眠态,等待驱动设备可以使用,非阻塞方式的话会通过 poll 函数来不断的轮询,查看驱动设备文件是否可以使用。这两种方式都需要应用程序主动的去查询设备的使用情况。
2024-10-20 22:01:43 946
原创 LINUX内核驱动非阻塞IO
当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,非阻塞 IO,应用程序对应的线程不会挂起,它要么一直轮询等待,直到设备资源可以使用,要么就直接放弃。应用程序使用非阻塞访问方式从设备读取数据,当设备不可用或数据未准备好的时候会立即向内核返回一个错误码,表示数据读取失败。应用程序会再次重新读取数据,这样一直往复循环,直到数据读取成功。如果应用程序要采用非阻塞的方式来访问驱动设备文件,可以使用如下所示代码:int fd;/* 非阻塞方式打开 *//* 读取数据 */
2024-10-19 18:45:51 618
原创 LINUX内核驱动阻塞IO
应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式IO就会将应用程序对应的线程挂起,直到设备资源可以获取为止。应用程序调用read函数从设备中读取数据,当设备不可用或数据未准备好的时候就会进入到休眠态。等设备可用的时候就会从休眠态唤醒,然后从设备中读取数据返回给应用程序。阻塞访问最大的好处就是当设备文件不可操作的时候进程可以进入休眠态,这样可以将CPU 资源让出来。但是,当设备文件可以操作的时候就必须唤醒进程。
2024-10-19 17:44:00 351
原创 LINUX驱动中断机制
每个中断都有一个中断号,通过中断号即可区分不同的中断,有的资料也把中断号叫做中断线。在 Linux 内核中使用一个 int 变量表示中断号。在Linux中,我们可以使用已经编写好的API函数来申请中断号,定义在include/linux/interrupt.h里面。上半部:上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。下半部:如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。
2024-10-19 16:32:48 854
原创 Linux驱动多线程通信方式
Linux是多任务操作系统,肯定会存在多个任务共同操作同一段内存或者设备的情况,多个任务甚至中断都能访问的资源叫做共享资源。在驱动开发中要注意对共享资源的保护,也就是要处理对共享资源的并发访问。C语言中 a = 3 这样一句代码,它编译时候其实不是一句代码,而是编译成汇编的3句代码:1 ldr r0, =0X30000000 /* 变量 a 地址 */2 ldr r1, = 3 /* 要写入的值 */
2024-10-16 11:40:41 755
原创 内核定时器API实现点灯
Linux 内核定时器使用很简单,只需要提供超时时间(相当于定时值)和定时处理函数即可,当超时时间到了以后设置的定时处理函数就会执行,和我们使用硬件定时器的套路一样,只是使用内核定时器不需要做一大堆的寄存器初始化工作。在使用内核定时器的时候要注意一点,内核定时器并不是周期性运行的,超时以后就会自动关闭,因此如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器。compat_ioctl函数的功能与unlocked_ioctl函数一样,区别在于64 位系统上,32 位的应用程序调用将会使用此函数。
2024-10-15 23:06:10 1072
原创 access()函数
注:当pathname为文件时,_access函数判断文件是否存在,并判断文件是否可以用mode值指定的模式进行访问。当pathname为目录时,_access只判断指定目录是否存在。00——只检查文件是否存在Existence only。头文件:#include<unistd.h>06——读写权限Read and writ。02——写权限Write-only。04——读权限Read-only。access()函数。
2024-10-12 14:15:04 268
原创 设备树pinctrl子系统
0x0090 0x031C 0x0000 0x5 0x0,这 5 个值的含义如下所示对应关系:0x0090:mux_reg 寄存器偏移地址;dtsi中的 iomuxc 节点就是 IOMUXC 外设对应的节点 , 根 据 其 reg 属 性 可 知 IOMUXC 外 设 寄 存 器 起 始 地 址 为 0x020e0000。因 此。
2024-10-11 15:09:37 826
原创 设备树实现LED点灯驱动
发先新增加的设备树节点alphaled,修改设备树成功。通过 of_property_read_u32_array 函数获取alphaled 节点的 reg 属性所有值, 并且将获取到的值都存放到 regdata 数组中。通过 of_find_node_by_path 函数,路径查找得到 alphaled 节点,返回dtsled.nd,给后续其他的 OF 函数使用。of_find_matching_node_and_match 函数通过 of_device_id 匹配表来查找指定的节点,函数原。
2024-10-10 19:19:46 1109
原创 linux点灯驱动实验实现
地址映射也就是虚拟地址到物理地址的映射,虚拟地址(VA,Virtual Address):简单理解为一段没有真正的内存的地址。在老版本的Linux中,为什么有些芯片不能再Linux下运行,比如说STM32,因为STM32没有MMU,虽然现在Linux内核也支持无MMU处理器,但是也没有多少人拿来Linux运行也就是这个主要的原因。与STM32等芯片不同的是,linux系统对引脚地址操作不是直接操作地址,而是通过地址映射的方式进行访问,所有的寄存器地址在Linux系统中都会被映射成一个虚拟地址。
2024-10-10 17:56:58 1017
原创 正点原子linux驱动笔记-字符设备驱动
在Linux中,为了方便管理,每个设备都有一个设备号,设备号由主设备号和次设备号组成。主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。从dev_t获取主设备号和次设备号,MAJOR(dev_t),MINOR(dev_t)。也可以使用主设备号和次设备号构成dev_t,通过MKDEV(major,minor);符设备之前先申请一个设备号,系统会自动给你一个没有被使用的设备号,这样就避免了冲突。静态分配设备号需要我们检查当前系统中所有被使用了的设备号,然后挑选一个没有使用。
2024-10-09 09:14:35 492
原创 sockaddr_un,sockaddr和sockaddr_in使用区别
Unix域协议并不是一个实际的协议族,它只是在同一台主机上进行客户-服务器通信时,使用与在不同主机上的客户和服务器间通信时相同的API(套接口或XTI)的一种方法。当客户和服务器在同一台主机上时,Unix域协议是IPC通信方式的一种替代品。sa_family是地址家族,一般是“AF_xxx”的形式。通常大多用的是都是AF_INET和AF_INET6。sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。sa_data是14字节协议地址。
2024-10-08 16:18:45 532
原创 prctl的函数和pthread_self函数
pthread_self() 函数是 POSIX 线程库的一部分,它提供了一个非常简单的功能:获取当前线程的唯一标识符。这个标识符是 pthread_t 类型的,通常是一个无符号的长整型值,不过具体的类型是由实现定义的,这意味着它可以在不同的操作系统上有不同的表示。此外,pthread_self() 在实现线程的同步操作时也很有用,例如,在一个线程中设置一个锁,并且只允许拥有这个锁的线程来释放它。线程ID可以用于比较操作,以判断两个线程ID是否相同。可以看到打印出的线程名字为xx,进程和线程的ID号不同。
2024-10-08 08:27:34 319
转载 C++常用的设计模式
C++单例模式、工厂模式、抽象工厂模式、适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式、观察者模式和命令模式
2024-04-12 17:17:04 1640
原创 GB28181网络视频协议
•媒体流的传输应采用RTP协议,提供实时数据传输中的时间戳信息及各数据流的同步;GB28181协议指的是国家标准GB/T 28181—2016《公共安全视频监控联网系统信息传输、交换、控制技术要求》,会话发起协议)是一个用于建立,更改和终止多媒体会话的应用层控制协议,其中的会话可以是。和安全性要求, 以及控制、传输流程和协议接口等技术要求,是视频监控领域的国家标准。1.该标准规定了公共安全视频监控联网系统的互联结构, 传输、交换、控制的基本要求。包括会话描述、媒体信息描述、时间信息描述。
2024-03-26 17:36:39 8491
原创 互斥量死锁出现和lock_guard类,unique_lock类的使用解析
互斥量死锁的出现和lock_guard类,unique_lock类的使用
2024-03-03 22:56:45 972
STM32F4xxx中文开发手册
2023-12-28
onvif各模块wsdl文件
2023-03-15
YOLOv5实现车辆目标检测
2022-06-30
lcd图片缩放算法.zip
2022-03-22
YOLOv5训练车辆类型识别TXT数据集
2022-03-21
嵌入式入门第一课——嵌入式入门要点,嵌入式ubantu系统安装及常见ubantu命令(详细见后期系统编程)
2022-03-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人