- 博客(207)
- 资源 (4)
- 收藏
- 关注
原创 802.11 无线WiFi管理帧
802.11 无线WiFi管理帧: 管理数据包控制网络的管理功能,1) 信标帧(Beacons): 在无线设备中,定时依次按指定间隔发送的有规律的无线信号(类似心跳包),主要用于定位和同步使用2) 解除认证(Deauthentication)数据包802.11其它帧结构见上文。
2025-10-20 10:05:18
651
原创 IEEE 802.11无线wifi帧结构
在某些帧 (如 Power Save Poll 帧)中,Duration/ID 字段包含的是站点的 Association ID (AID)身份标识,这是一个由接入点 (AP) 分配给每个关联站点的唯一标识符。片段号用于标识帧的分片部分。//Disassociation/Deauthentication帧,Probe Request/Response帧, Probe Response(检测应答)帧, IBSS 的ATIM帧, Authentication帧等,其余帧结构后续补充。指示关联请求的处理结果。
2025-10-18 16:49:19
997
原创 Linux网络设备驱动—netlink
建立 netlink 套接字函数在成功的时候,返回一个 structure sock 指针类型的值,之后可以用这个值对 netlink 套接字进行处理;当返回值为 NULL 的时候,套接字建立失败了,需要进行资源的释放。netlink_kernel_create 是 Linux 内核中的一个函数,主要用于创建 Netlink 套接字,以便于内核与用户空间的通信。向skb缓冲区中获取消息头空间并且初始化netlink消息头,入参中的第5个参数为netlink消息头的总空间。
2025-09-16 09:13:46
715
原创 Linux网络设备驱动—网络连接状态和从参数设置
网络设备驱动 可以通过netif_carrier_on()和netif_carrier_off()函数改变设备的连接状态,如果驱动检测到连接状态发 生变化,也应该以netif_carrier_on()和netif_carrier_off()函数显式地通知内核。只是列出了net_device_stats包含的主项目统计信息,实际上,这些项目还可以进一步细分,net_device_stats中的其他信息给出了更详细的子项目统计,详见Linux源代码。具体的设备是否接受这 些信息的修改,要视硬件的设计而定。
2025-09-15 15:02:20
825
原创 Linux网络设备驱动—数据收发
网络设备接收数据的主要方法是由中断引发设备的中断处理函数,中断处理函数判断中断类型,如果 为接收中断,则读取接收到的数据,分配sk_buffer数据结构和数据缓冲区,将接收到的数据复制到数据缓 冲区,并调用netif_rx()函数将sk_buffer传递给上层协议。napi_schedule()函数被轮询方式驱动的中断程序调用,将设备的poll方法添加到网络层的poll处理队列中,排队并且准备接收数据包,最终触发一个NET_RX_SOFTIRQ软中断,从而通知网络层接收数据包。
2025-09-15 14:15:03
766
原创 LINUX中USB驱动架构—USB驱动程序框架
open()成员函数的实现非常简单,它根据usb_driver和次设备号 通过usb_find_interface()获得USB接口,之后通过usb_get_intfdata()获得接口的私有数据并赋予file- >private_data。usb_register_dev(interface,&skel_class)中的第二个参数skel_class包含了字符设备的 file_operations结构体指针,而这个结构体中的成员实现也是USB字符设备的另一个组成成分。在usb_driver的。
2025-09-13 10:29:18
386
原创 LINUX中USB驱动架构—探测和断开
对于字符设备而言,usb_class_driver结构体的fops成员中的write()、read()、ioctl()等函数的地位完全等同于字符设备中的file_operations成员函数。如果是其他类型的设备,如tty设备,则调用对应设备的注册函数。在USB设备驱动usb_driver结构体的probe()函数中,应该完成如下工作。在USB设备驱动usb_driver结构体的probe()函数中,应该完成如下工作。对于其他类型的设备,如tty设备,则调用对应设备的注销函数。
2025-09-13 09:21:04
251
原创 LINUX中USB驱动架构—URB请求块
USB本身所属设备驱动的结构与其挂不挂在USB总线上没什么关系,但是据此在访问方式上却有 很大的变化,例如,对于USB接口的字符设备而言,尽管仍然是write()、read()、ioctl()这些函数,但是在这些函数中,贯穿始终的是称为URB的USB请求块。
2025-09-13 09:07:21
649
原创 LINUX中USB驱动架构—设备驱动
usb_device_id数组,usb_device_id结构体包含有USB设备的制造商ID、产品ID、产品版本、设备类、接口类等信息及其要匹配标志成员match_flags(标明要与哪些成员匹配,包含DEV_LO、DEV_HI、DEV_CLASS、DEV_SUBCLASS、DEV_PROTOCOL、INT_CLASS、INT_SUBCLASS、INT_PROTOCOL)。usb_driver结构体中的id_table成员描述了这个USB驱动所支持的USB设备列表,它指向一个。
2025-09-12 19:39:52
351
原创 LINUX中USB驱动架构—主机驱动
USB采用树形拓扑结构,主机侧和设备侧的USB控制器分别称为主机控制器(Host Controller)和USB 设备控制器(UDC),每条总线上只有一个主机控制器,负责协调主机和设备间的通信,而设备不能主 动向主机发送任何消息。从主机侧去看,在Linux驱动中,处于USB驱动最底层的是USB主机控制器硬 件,在其上运行的是USB主机控制器驱动,在主机控制器上的为USB核心层,再上层为USB设备驱动层 (插入主机上的U盘、鼠标、USB转串口等设备驱动)。因此,在主机侧的层次结构中,要实现的USB驱 动包括两
2025-09-12 17:11:28
983
原创 开发板烧写命令和系统启动参数设置
sf probe 0 —— 选择spi0作为下载方式,这里代表为以spi方式下载,因为使用的是spi flash。sf write 0x40000000 0x0 0x90000 把SDRAM地址 0x40000000 处 0x90000( Flash.img大小为576kb)的数据烧写到 flash 的 0 偏移地址。root=/dev/mtdblock2 — 跟文件系统在第2个分区(分区从0开始算起),第0个分区是uboot,第1个分区是kernel,第2个分区为文件系统;
2025-09-12 13:46:40
430
原创 linux系统启动时脚本命令执行
Linux内核启动过程中,会挂载文件系统,在文件系统挂载后,运行的第一个程序就是根目录下的linuxrc,而这是一个指向/bin/busybox 的链接,也就是说,系统起来后运行的第一个程序就是busybox本身。再然后,busybox会解析“/etc/inittab”配置文件,而/etc/inittab配置文件里面会运行/etc/init.d/rcS这个脚本!这句话的意思是遍历/etc/init.d/下的以名称为S开头的,紧接着是数字0-9,再紧跟着还是数字0-9,再往后有多少字符不限制的文件。
2025-09-11 17:56:28
350
原创 SPI设备驱动
申请或者 定义一个spi_driver,然后初始化spi_driver中的各个成员变量,当SPI设备和驱动匹配以后,spi_driver下的probe函数就会执行!构建spi_transfer,然后将其打包到spi_message里面,需要使用spi_message_init初始化spi_message,然后在使用spi_message_add_tail将spi_transfer添加到spi_message里面,最终使用spi_sync和spi_async来发送。:与SPI设备对应的SPI驱动。
2025-09-11 11:08:52
858
原创 Linux设备驱动中的并发控制(一)
该宏用于定义并初始化一个名为name的等待队列元素。4.添加/移除等待队列add_wait_queue()用于将等待队列元素wait添加到等待队列头部q指向的双向链表中,而 remove_wait_queue()用于将等待队列元素wait从由q头部指向的链表中移除。
2025-09-10 17:25:27
845
原创 富瀚MC632X jffs2文件系统制作
根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文 件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载 (mount。目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否需要配置文件。文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。中的文件应该是 只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如/var。
2024-11-08 16:09:01
1392
2
原创 LINUX底层命令sed
sed -i 'Nc 替换内容' filename //替换第N行内容。一般在底层要替换某内容,很少打开该文件确认位置再用这个命令。替换一个文件中的部分内容。
2024-11-01 09:12:00
347
原创 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
925
原创 DDR内存和Flash内存
NAND 闪存的存储单元则采用串行结构,存储单元的读写是以页和块为单位来进行(一页包含若干字节,若干页则组成储存块, NAND 的存储块大小为 8 到 32KB ),这种结构最大的优点在于容量可以做得很大,超过 512MB 容量的 NAND 产品相当普遍, NAND 闪存的成本较低,有利于大规模普及。由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。通常称为闪存,也是内存器件的一种。
2024-10-29 11:43:13
663
原创 LINUX总线-设备-驱动匹配
根据总线-驱动-设备驱动模型,IIC、SPI、USB这样实实在在的总线是完全匹配的,但是要有一些外设是没法归结为具体的总线:比如定时器、RTC、LCD等。为此linux内核创造了一个虚拟的总线:platform总线。根据驱动的分离与分层衍生出了总线(bus)-驱动(driver)-设备(device)驱动框架。设备:设备属性,包括地址范围、如果是IIC的话还有IIC器件地址、速度......总线代码我们不需要编写,linux内核提供给我们使用的。向总线注册设备的时候,使用。驱动:是具体的设备驱动。
2024-10-29 09:36:51
810
原创 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
2000
1
原创 strcat函数追加字符串
使用strcat函数给目标字符串追加字符时,首先要找到目标字符串中'\0'的位置,然后在'\0'的位置上向后追加源字符串。源字符串src是从目标字符串src中的'\0'位置开始追加的,同时源字符串sdest中的'\0'也一并追加了过去。
2024-10-22 10:28:21
272
原创 LINUX内核驱动-总线-设备模型
match 函数很重要,单词 match 的意思就是“匹配、相配”,因此此函数就是完成设备和驱动之间匹配的,总线就是使用 match 函数来根据注册的设备来查找对应的驱动,或者根据注册的驱动来查找相应的设备,因此每一条总线都必须实现此函数match 函数有两个参数: dev 和 drv,这两个参数分别为 device 和 device_driver 类型,也就是设备和驱动。name 表示设备名字,要和所使用的 platform 驱动的 name 字段相同,否则的话设备就无法匹配到对应的驱动。
2024-10-22 08:56:45
1126
1
原创 LINUX内核驱动异步机制
我们首先来回顾一下“中断”,中断是处理器提供的一种异步机制,我们配置好中断以后就可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数,在中断服务函数中做具体的处理。Linux 应用程序可以通过阻塞或者非阻塞这两种方式来访问驱动设备,通过阻塞方式访问的话应用程序会处于休眠态,等待驱动设备可以使用,非阻塞方式的话会通过 poll 函数来不断的轮询,查看驱动设备文件是否可以使用。这两种方式都需要应用程序主动的去查询设备的使用情况。
2024-10-20 22:01:43
1051
原创 LINUX内核驱动非阻塞IO
当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,非阻塞 IO,应用程序对应的线程不会挂起,它要么一直轮询等待,直到设备资源可以使用,要么就直接放弃。应用程序使用非阻塞访问方式从设备读取数据,当设备不可用或数据未准备好的时候会立即向内核返回一个错误码,表示数据读取失败。应用程序会再次重新读取数据,这样一直往复循环,直到数据读取成功。如果应用程序要采用非阻塞的方式来访问驱动设备文件,可以使用如下所示代码:int fd;/* 非阻塞方式打开 *//* 读取数据 */
2024-10-19 18:45:51
748
原创 LINUX内核驱动阻塞IO
应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式IO就会将应用程序对应的线程挂起,直到设备资源可以获取为止。应用程序调用read函数从设备中读取数据,当设备不可用或数据未准备好的时候就会进入到休眠态。等设备可用的时候就会从休眠态唤醒,然后从设备中读取数据返回给应用程序。阻塞访问最大的好处就是当设备文件不可操作的时候进程可以进入休眠态,这样可以将CPU 资源让出来。但是,当设备文件可以操作的时候就必须唤醒进程。
2024-10-19 17:44:00
496
原创 LINUX驱动中断机制
每个中断都有一个中断号,通过中断号即可区分不同的中断,有的资料也把中断号叫做中断线。在 Linux 内核中使用一个 int 变量表示中断号。在Linux中,我们可以使用已经编写好的API函数来申请中断号,定义在include/linux/interrupt.h里面。上半部:上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。下半部:如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。
2024-10-19 16:32:48
1059
原创 Linux驱动多线程通信方式
Linux是多任务操作系统,肯定会存在多个任务共同操作同一段内存或者设备的情况,多个任务甚至中断都能访问的资源叫做共享资源。在驱动开发中要注意对共享资源的保护,也就是要处理对共享资源的并发访问。C语言中 a = 3 这样一句代码,它编译时候其实不是一句代码,而是编译成汇编的3句代码:1 ldr r0, =0X30000000 /* 变量 a 地址 */2 ldr r1, = 3 /* 要写入的值 */
2024-10-16 11:40:41
900
原创 内核定时器API实现点灯
Linux 内核定时器使用很简单,只需要提供超时时间(相当于定时值)和定时处理函数即可,当超时时间到了以后设置的定时处理函数就会执行,和我们使用硬件定时器的套路一样,只是使用内核定时器不需要做一大堆的寄存器初始化工作。在使用内核定时器的时候要注意一点,内核定时器并不是周期性运行的,超时以后就会自动关闭,因此如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器。compat_ioctl函数的功能与unlocked_ioctl函数一样,区别在于64 位系统上,32 位的应用程序调用将会使用此函数。
2024-10-15 23:06:10
1158
原创 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
704
原创 设备树pinctrl子系统
0x0090 0x031C 0x0000 0x5 0x0,这 5 个值的含义如下所示对应关系:0x0090:mux_reg 寄存器偏移地址;dtsi中的 iomuxc 节点就是 IOMUXC 外设对应的节点 , 根 据 其 reg 属 性 可 知 IOMUXC 外 设 寄 存 器 起 始 地 址 为 0x020e0000。因 此。
2024-10-11 15:09:37
1130
原创 设备树实现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
1394
原创 linux点灯驱动实验实现
地址映射也就是虚拟地址到物理地址的映射,虚拟地址(VA,Virtual Address):简单理解为一段没有真正的内存的地址。在老版本的Linux中,为什么有些芯片不能再Linux下运行,比如说STM32,因为STM32没有MMU,虽然现在Linux内核也支持无MMU处理器,但是也没有多少人拿来Linux运行也就是这个主要的原因。与STM32等芯片不同的是,linux系统对引脚地址操作不是直接操作地址,而是通过地址映射的方式进行访问,所有的寄存器地址在Linux系统中都会被映射成一个虚拟地址。
2024-10-10 17:56:58
1122
原创 正点原子linux驱动笔记-字符设备驱动
在Linux中,为了方便管理,每个设备都有一个设备号,设备号由主设备号和次设备号组成。主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。从dev_t获取主设备号和次设备号,MAJOR(dev_t),MINOR(dev_t)。也可以使用主设备号和次设备号构成dev_t,通过MKDEV(major,minor);符设备之前先申请一个设备号,系统会自动给你一个没有被使用的设备号,这样就避免了冲突。静态分配设备号需要我们检查当前系统中所有被使用了的设备号,然后挑选一个没有使用。
2024-10-09 09:14:35
613
原创 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
977
原创 prctl的函数和pthread_self函数
pthread_self() 函数是 POSIX 线程库的一部分,它提供了一个非常简单的功能:获取当前线程的唯一标识符。这个标识符是 pthread_t 类型的,通常是一个无符号的长整型值,不过具体的类型是由实现定义的,这意味着它可以在不同的操作系统上有不同的表示。此外,pthread_self() 在实现线程的同步操作时也很有用,例如,在一个线程中设置一个锁,并且只允许拥有这个锁的线程来释放它。线程ID可以用于比较操作,以判断两个线程ID是否相同。可以看到打印出的线程名字为xx,进程和线程的ID号不同。
2024-10-08 08:27:34
624
STM32F4xxx中文开发手册
2023-12-28
onvif各模块wsdl文件
2023-03-15
YOLOv5实现车辆目标检测
2022-06-30
嵌入式入门第一课——嵌入式入门要点,嵌入式ubantu系统安装及常见ubantu命令(详细见后期系统编程)
2022-03-15
lcd图片缩放算法.zip
2022-03-22
YOLOv5训练车辆类型识别TXT数据集
2022-03-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅