自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(351)
  • 资源 (1)
  • 收藏
  • 关注

原创 C语言高级编程系列

关于C语言高级编程系列文章。笔者主要从事Linux kernel、BSP、driver以及TCP/IP方向工作,日常主要使用C语言。工作数年,感叹C语言的简洁却不简单,至今仍不敢说精通C,希望可以通过此系列文章的总结系统地提升自己。更新于:20191124目录:C语言高级编程:预处理中的 # 和 ## C语言高级编程:深入理解const C语言高级编程:数组名赋值给...

2019-09-08 11:20:21 16569 1

原创 linux pcie nvme存储架构

VFS为不同的文件系统提供一个统一的接口,使用户空间应用能够以一致的方式访问不同类型的文件系统。在这个过程中,各层之间紧密协作,确保了数据的有效写入,并充分利用了NVMe SSD的高速性能。- VFS接收到写请求,并根据文件所在的文件系统将请求定向到正确的文件系统驱动。- 它负责将数据组织成适当的格式,并更新文件的元数据(如大小、时间戳等)。- NVMe驱动程序是内核的一部分,负责处理NVMe SSD的低级控制。- 在这一层,实际的数据存储和检索操作发生,利用SSD的高速闪存技术。

2024-01-05 17:55:19 379

原创 嵌入式系统中的AB分区

在实践中,嵌入式设备会有两个独立的分区,即A分区和B分区。在任何时候,一个分区运行当前的操作系统,而另一个分区则用于下载和安装新的更新。更新完成后,系统会在下次启动时切换到包含新版本的分区,同时旧版本保留在另一分区作为备份。这种设计提高了系统的稳定性和可靠性,是现代嵌入式系统中常见的一种做法。嵌入式系统中的AB分区是一种重要的机制,主要用于确保系统更新的安全性和可靠性。这是因为旧的系统版本仍然保存在另一个分区中。1. 无缝更新:AB分区允许系统在后台下载和安装更新,而不影响当前运行的系统。

2024-01-05 17:52:47 599

原创 linux emmc raw 读写

从eMMC分区读取数据到文件:`dd if=/dev/mmcblk0pX of=/path/to/output/file bs=block_size count=number_of_blocks`- 写数据到eMMC分区:`dd if=/path/to/input/file of=/dev/mmcblk0pX bs=block_size`。通过devtmpfs(/dev/mmcblkxxx节点)来访问(读写)block device。

2024-01-05 17:50:38 485

原创 nor、nand flash文件系统的选择

对于 NAND 类型的闪存,选择合适的文件系统时需要考虑 NAND 闪存的一些特性,如高存储密度、较低的成本、快速的写入和擦除速度,以及对坏块的管理。- JFFS2 (Journaling Flash File System version 2):这是一种日志文件系统,特别设计用于闪存,能够有效地处理写入和擦除的限制,同时提供数据的完整性保护。选择哪种文件系统取决于具体的应用场景和需求。2. 较慢的写入和擦除速度:NOR 闪存的写入和擦除速度相对较慢,所以理想的文件系统应该尽量减少写入操作和擦除次数。

2024-01-05 17:47:11 508

原创 Flash的读写机制

首先,选定的存储区域(通常是一个块)会被整体擦除,这意味着所有的位都被设置为1。4. 页与块的大小:NAND Flash的页大小通常是256B,512B,2048B,4096B,而块的大小是32K, 64K, 128K,这取决于具体的NAND Flash架构。3. 擦除操作:与NOR Flash类似,NAND Flash的擦除操作是按块进行的。由于其擦除操作是按块进行的,频繁的写入和擦除操作会逐渐降低特定块的可靠性。3. 擦除操作:NOR Flash的擦除是按块进行的,而不是单个字节。

2024-01-05 17:46:20 500

原创 行为驱动开发BBD

这种方法的核心在于使用清晰、易懂的语言(通常是英语)来描述软件应该如何行动,使非技术团队成员也能参与到软件的开发过程中。- BDD 则更注重于定义可执行的规范和验收标准,通常是通过编写格式化的场景和步骤(如“给定-当-然后”结构)来实现。1. 易懂的语言: 使用业务语言来描述软件行为,通常遵循“给定-当-那么”(Given-When-Then)的格式。- 增强沟通: BDD促进了技术和非技术团队成员之间的沟通,帮助确保所有人都对期望的软件行为有共同的理解。这些测试最初都是失败的,因为相应的功能还没实现。

2023-12-28 18:26:44 385

原创 测试驱动开发TDD

但在更复杂的场景下,这一步骤会涉及优化代码结构,提高代码效率,提升可读性和可维护性,同时保证测试依然通过。通过这个简单的例子,我们可以看到TDD的基本流程:首先编写一个针对新功能的失败测试,然后编写最小的代码量以通过测试,最后对代码进行重构以提高质量。3. 重构代码: 在测试通过后,进行代码重构,以改善代码的结构和清晰度,同时确保测试依然通过。这一步的目标是尽快通过测试,因此所写的代码可能并不完美。让我们通过一个简单的例子来说明测试驱动开发(TDD)的过程:假设我们需要开发一个函数,它用于计算两个数的和。

2023-12-28 18:25:40 382

原创 软件质量保证(SQA)

这三个方面涉及了软件开发的关键阶段:从理解和定义需求开始,通过测试和自动化来确保实现的质量,最后通过代码审查和持续改进来提高整体的工作效率和效果。这不仅关乎技术层面的执行,还涉及到组织文化和团队合作的方面,确保质量成为软件生命周期的核心组成部分。- 选用适当的工具来支持开发和测试工作,如集成开发环境(IDE)、测试框架、构建和部署工具等。- 通过全面的测试(包括单元测试、集成测试、系统测试和用户验收测试)来识别和修复错误。- 它涉及与客户的持续沟通和反馈,有助于及时调整方向,适应需求的变化。

2023-12-28 18:24:57 404

原创 软件全面质量管理

软件全面质量管理(Software Total Quality Management,简称软件TQM)是一种管理方法,旨在通过持续改进过程、产品和服务来提高组织的质量和效率。通过培训、团队合作和有效沟通,确保每个员工都理解他们的角色如何影响最终产品的质量,并积极参与到质量改进的活动中。这要求组织不断寻找改进的机会,通过定期的回顾和评估,以及鼓励创新和改进的思维方式。通过这些方法,基于TQM的软件质量改进可以帮助组织更有效地满足用户需求,提高产品的竞争力,同时也促进内部流程的效率和效果。

2023-12-28 18:23:51 351

原创 emmc、spi nor、spi nand三种flash 优缺点及应用场景

由于存储密度较大且制造成本相对较低,SPI NAND Flash适用于对成本要求很高的应用,但可能在速度和寿命上有一些妥协。SPI NOR Flash的制造成本较低,且适用于对成本敏感的应用,例如一些嵌入式系统。由于其高集成度和大容量,制造和集成eMMC的成本相对较高。- 依然适用于嵌入式系统,尤其是对存储容量和成本敏感的应用,如一些物联网设备。选择合适的Flash类型应基于具体应用需求,考虑性能、功耗、寿命、成本和集成度等因素。- 较长的寿命,适用于需要频繁读写的场景。- 相对较高的功耗和复杂性。

2023-12-11 18:19:41 1030

原创 WiFi理论速率计算

Wi-Fi在传输时,根据空口环境的好坏,会加入不同数量的纠错码,用来提高传输的可靠性,空口环境越差,纠错码越多,数据占比越少,码率越低,反之亦然。传输时间是传输一个Symbol需要的时间加上一个间隙(GI)。Wi-Fi理论速率=编码方式*码率*最大信道有效子载波数量*单位时间符号传输数量(1/符号传输周期)*空间流数量。我们以最高码率(5/6)、最大空间流(8*8)、最大频宽(160M)来计算一下11ax的最高速率。Wi-Fi理论带宽 =(符号位长×码率×子载波数量)÷ 传输时间 ×空间流。

2023-12-07 17:45:45 246

原创 linux wifi tool: iw

iw是Linux下的一种wifi配置工具,它替代了Wireless tools中的iwconfig和iwlist,支持最近已添加到内核所有新的驱动程序,有两种加密认证加密方式:open(开放系统认证+有效等线加密)、wep方式(共享秘钥认证+有效等线加密)iw list # 获得所有设备的功能,如带宽信息(2.4GHz,和5GHz),和802.11n的信息。iw wlan0 connect foo # 连接到已禁用加密的AP,这里它的SSID是foo。iw dev wlan0 scan # 扫描。

2023-12-07 17:43:46 143

原创 buildroot wifi tools编译

注:如果仅使用station模式,则无需使用hostapd。

2023-12-07 17:42:05 95

原创 AP6256 wifi驱动linux开发及验证

build ko{ …} else#endif#endif0x02d00xaaecpmf=1network={7.4ping。

2023-12-07 17:39:45 233

原创 WiFi4、WiFi5、WiFi6、WiFi7速率区别

不过到了2018年,WiFi联盟正式将802.11ax标准定为第六代WiFi技术,与此同时也开启了WiFi协议命名简化的时代。目前市面上主流的WiFi协议有这样几个:802.11n、802.11ac(wave1、wave2)、802.11ax。WiFi 5 单流:433Mbps,8流:3466Mpbs (wave2版本,867Mbps,8流:6933Mpbs)WiFi 6 单流:1200Mbps,8流:9.6Gpbs。WiFi 4 单流:150Mbps,4流:600Mpbs。

2023-12-07 17:35:39 1689

原创 插sd卡提示: Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

先fdisk新建分区,然后执行:mkfs.vfat /dev/mmcblk1p1 创建fat32文件系统。2)不umount,直接拔卡,再次mount便会出现上述问题。测试mount和umount,不会出现上述提示。1)新格式化的卡测试,无问题。先umount,再拔卡。

2023-11-03 17:12:52 1092

原创 usb host配置好trb后,如何启动传输?

CMD_RUN用来run xhci controller,与trb传输没关系。stream ID用于usb3.0 bulk传输。读DB寄存器是0,原因见DB寄存器描述。使用doorbell启动传输,2. doorbell寄存器。

2023-11-03 17:07:50 153

原创 读写usb host xhci寄存器

比如读取xhci PORTSC寄存器:寄存器地址计算方法如下:CAPLENGTH。

2023-11-03 17:05:02 134

原创 SD 轮训方式检测卡插拔

注:只有在polling模式下,mmc_rescan才会调用mmc_schedule_delayed_work(&host->detect, HZ)一直轮询。中断方式无论卡是否在位,都不会polling。host->bus_ops->alive返回0,代表card还在,但是还要继续通过host->ops->get_cd判断一次(原因见代码注释)在dts中配置 broken-cd,使能polling模式。1s polling1次。2. 插入卡(卡在位)

2023-11-03 17:01:58 115

原创 SD卡热插拔检测机制

通过TF卡座的pin9来检测,信号CARD_DETECT(pin9)连到soc一个sd_det_n pin(该pin会接到cdns ip的s0_sdcd_n signal)。在没有插卡时,CARD_DETECT信号为高电平。插入T卡后,信号 CARD_DETECT 被拉低,sd controller产生一个中断,即实现了热插拔。Pin1到Pin8和Micro SD卡脚定义相同,Pin9脚是CD(card detect脚),如果插入卡pin9脚就和GND连在一起。

2023-11-03 17:00:06 522

原创 SD使用gpio方式检测卡热插拔

可以观察到,虽然TF CARD(micro)只有8个引脚,但是卡座另外定义了一个CD引脚(DET_SWITCH),该pin可以接到一个gpio。sd slot上的detect pin接到soc的一个gpio pin,插拔卡,会产生gpio中断,再读取gpio value判断卡是否在位。我的猜想是,对于tf card卡座来说,当tf card插入时,会把CD引脚(DET_SWITCH)拉低。当card没有插入的情况下,DET_SWITCH的gpio为高电平。dts配置,如使用gpio1_a8。

2023-11-03 16:55:37 209

原创 mmc/sd phy delay

但read时,card用的是controller提供的clock,相位不确定,需要计算一个偏移值。5)不同的speed mode其delay不一样,相同speed mode不同频率下其delay也不一样,一般计算最高频率的delay。比如在rom中计算default speed 10M的delay,在spl中计算default speed 25M的delay值。cdns,phy-dll-delay-strobe以及cdns,phy-dll-delay-sdclk-hsmmc用于mmc。

2023-09-01 19:43:42 181

原创 sparse格式image

使用这个参数,make_ext4fs会根据private/android_filesystem_config.h里定义好的权限来给文件夹里的所有文件重新设置权限,如果你刷机以后发现有文件权限不对,可以手工修改android_filesystem_config.h来添加权限,重新编译make_ext4fs,也可以不使用 “-a system”参数,这样就会使用文件的默认权限。稀疏镜像:即sparse image,将raw ext4进行稀疏描述,因此尺寸比较小,制作目录有多少文件就计算多少,没有全零填充。

2023-09-01 19:39:37 725

原创 linux pcie ep configfs driver

mkdir functions/pci_epf_axnet/func1 //执行probe。没有执行pci_epf_release函数,反而调用了pci_epf_drop。执行这个指令时,会直接返回,不会进行实际的disable ltssm动作。用多少msi中断就写相应的数量到msi_interrupts。如何在configfs触发?2)vendorid等信息。

2023-09-01 19:33:32 192

原创 linux pcie NTB

linux-5.15.73/drivers/net/ntb_netdev.c //会调用register_netdev注册netdev。通过 ntb_netdev,可以在两个RC之间建立虚拟网络。3.2 用多EP口SOC来实现一个NTB。也可以用多EP口SOC来实现一个NTB。NTB是一个专用hardware。

2023-09-01 19:26:23 239

原创 利用winhex查看文件系统裸数据

以及FAT32文件系统:引导扇区(MBR和DBR)、FAT1和FAT2、根目录(即数据区)winhex用于分析文件系统和裸数据(Hex Editor & Disk Editor)工具 --> 打开磁盘 --> 选择磁盘打开。查看 --> 显示 --> 目录浏览器。可以显示SD全部sector的数据。引导扇区(MBR和DBR)

2023-09-01 19:22:23 595

原创 FAT32文件系统详解

0x3E8~0x3EB:4个字节,文件系统的空簇数,FF FF FF FF,这个值感觉有问题,格式化SD卡新建一个小于4K的文件,此处的值变成1C F6 FE,所以上面的值应该为0x1FF6FF,猜测可能是由于格式化之后就会将此处置FF,新建文件后才会恢复。6号扇区也会有一个引导扇区的备份,相应的7号扇区应该是一个备份FSINFO信息扇区,8号扇区可以看做是2号扇区的备份。0x41~0x41:1字节,与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已。

2023-08-11 17:56:20 1438

原创 fat32:由文件定位存储位置

某簇起始扇区号 = 保留扇区数 + 每个 FAT 表大小扇区数 × FAT 表个数 + (该簇簇号 - 2) × 每簇扇区数。0x1C~0x1F:4字节,DBR分区之前所隐藏的扇区数,0x0,即DBR前面没有隐藏分区(MBR)0x24~0x27:4字节,每个FAT表占用扇区数,0x3a36(总共两个fat表)0x0B~0x0C:2字节,每扇区字节数,0x0200=512字节。0x0D~0x0D:1字节,每簇扇区数,0x20=32。0x0E~0x0F:2字节,保留扇区数,0x0b94。

2023-08-11 17:54:20 217

原创 SD外部控制:power、IO voltage切换、card detection

正常情况应该使CDSS=1,使用s0_sdcd_n来检测插拔。s0_ifm[3] --> sd_pwr_sw,用于切换IO的电压(接到IP内部的s0_1v8,来源是s0_ifm[3])与SD相关的3个pin:sd_power_en & sd_card_detect_n & sd_power_sw。bit3 of 0x3e可以控制sd_pwr_sw,进而控制VDDIO33_18_SDCARD的电平。s0_sdcd_n --> sd_det_n,用于检测card。

2023-08-11 17:51:23 322

原创 sdio/sd/emmc 硬件电路设计

DHC1_DATA0~DATA3/USDHC1_CLK/USDHC1_CMD 分别连接到 I.MX6U 的 I.MX6U 的。WIFI_INT和WIFI_REG_ON连接到I.MX6U。USDHC1_DATA0~DATA3/USDHC1_CLK/USDHC1_CMD 分 别 连 接 在 I.MX6U 的。注意: TF 卡接口和 SDIO WIFI 接口公用一个 SDIO,因此 TF 卡和 SDIO 不能同时使用!和 SDIO WIFI 接口公用一个 SDIO,因此 TF 卡和 SDIO 不能同时使用!

2023-08-11 17:46:36 1205

原创 linux cdns mmc/sd 驱动分析

pdata->ops即sdhci_cdns_ops,see chapter4。6.1 传输数据和命令。

2023-08-11 17:42:51 203

原创 获取当前进程或线程PID方法

pthread_self返回的是同一个进程中各个线程之间的标识号,对于这个进程内是唯一的,而不同进程中,每个线程返回的pthread_self可能是一样的。而gettid是整个系统内各个线程间的标识符,由于linux采用轻量级进程实现的,它其实返回是pid号。pthread_t由pthread线程库分配和维护,仅能保证同一个进程中是唯一的。但POSIX标准并没有规定pthread_t的具体格式,不同系统中pthread_t的实现可能是不一样的。sys_getpid,进程ID。TID( LWP),线程ID。

2023-07-03 17:14:24 623

原创 修改buildroot中某个软件包的版本

用于hash校验,比对从网络传输到本地的文件是否正确,也可以直接删除ethtool.hash文件,那么编译时会跳过hash校验步骤。以ethtool为例,在buildroot-2020.02.8中,ethtool默认版本为5.4,现将其修改为5.2。修改后,直接make。

2023-07-03 17:12:13 587 1

原创 usb configfs使能gadget流程

3. composite_bind用于legacy。

2023-07-03 17:10:24 266

原创 存储介质block和sector的区别

A number of bytes, basic data transfer unit (SD中最小的读写单位,一般为512B)。SD卡协议中 与 HardDisk(文件系统)的block和sector不一个意思。可以看到sector大小为512B,总共30031872个sector。Block是文件系统上的概念,一般文件系统block大小为4K。Sector是硬盘/U盘最小读写单元,一般为512字节。这里的block,即U盘最小读写单位,512字节。Linux中,block和sector的区别。

2023-07-03 17:09:34 455

原创 linux应用层通过socket访问PHY寄存器

phytool通过socket访问PHY寄存器。1. kernel实现。

2023-07-03 16:59:46 337

原创 内核模块间的符号调用

模块B编译好后会生成符号表文件Module.symvers,里面有导出的符号名,把该文件拷贝到需要调用的模块A的源代码下,然后重新编译模块A。EXPORT_SYMBOL_GPL():和EXPORT_SYMBOL类似,但范围只适合GPL许可的模块进行调用。EXPORT_SYMBOL():括号中定义的函数对全部内核代码公开。模块A需要调用模块B中定义的函数或变量。先extern声明需要调用的函数或变量。加载模块顺序必须先B后A,卸载相反。两个内核模块:模块A和模块B。1. 模块B导出函数或变量。

2023-06-09 18:51:13 391

原创 重新编译buildroot中的某个软件包

而根据我们的需要是要修改然后重新编译,安装即可。所以删除.stamp_built和.stamp_target_installed就可以。buildroot中的软件包一但编译完成后,后面重新make,不会再编译该软件包,即使你修改了该软件包的代码。每个工具包里都有.stamp_xxx文件,这几个文件主要控制这个工具包的下载,解压,打包,配置,编译,安装。在main函数中添加:printf("test buildroot rebuild\n");以buildroot-2020.02.8中ethtool为例。

2023-06-09 18:45:31 662

原创 pcie外设汇总

pcie nvme固态硬盘。pcie采集卡(视频采集)pcie usb扩展卡。pcie转type-c。

2023-06-09 18:38:53 243

基于stm32的语音识别

基于stm32的语音识别,专用语音芯片ld3320,源代码,详细资料介绍

2014-04-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除