- 博客(368)
- 资源 (1)
- 收藏
- 关注

原创 C语言高级编程系列
关于C语言高级编程系列文章。笔者主要从事Linux kernel、BSP、driver以及TCP/IP方向工作,日常主要使用C语言。工作数年,感叹C语言的简洁却不简单,至今仍不敢说精通C,希望可以通过此系列文章的总结系统地提升自己。更新于:20191124目录:C语言高级编程:预处理中的 # 和 ## C语言高级编程:深入理解const C语言高级编程:数组名赋值给...
2019-09-08 11:20:21
18085
2
原创 linux SD/eMMC 存储架构
2. VFS(虚拟文件系统)层:Linux的 VFS 提供了一个统一的接口,用于访问不同类型的文件系统,如 ext4、FAT32 等。1. 应用层:这是最上层,包括你使用的文件系统工具,如 `dd`、`cp` 或其他工具。4. 块设备层:在这一层,数据被管理为块设备的一部分,SD卡被视为一个块设备。5. 设备驱动层:这是与硬件直接交互的层面,处理与 SD 卡控制器的通信。6. 硬件层:最底层是实际的 SD 卡硬件,数据在这里被物理写入到卡上。Linux向 SD 卡写入数据时会经过哪些软件层。
2024-11-17 11:21:43
897
原创 linux nor flash raw读写
而通过/dev/mtdblock4写,先写到一个RAM,然后再更新到flash(这里驱动会先erase),属于间接访问。nor falsh写前需要erase(全FF),/dev/mtd4作为char设备,需要通过ioctl进行erase再写入。通过/dev/mtdN 字符设备或者/dev/mtdblockN块设备 去读写nor flash,无需通过文件系统。注意,通过/dev/mtd4写时,无法写成功,why?为何/dev/mtdblock4 块设备可以直接写?使用/dev/mtd4读可以成功。
2024-11-17 11:20:17
147
原创 多队列网卡介绍
流量控制:通过将不同类型的流量分配到不同的发送队列,并根据需要配置每个队列的优先级和调度算法,可以实现流量控制和QoS。- 并行发送:多队列网卡允许系统同时将数据发送到多个队列,每个队列都有独立的发送引擎。这意味着系统可以并行发送多个数据流,从而提高了发送的并发性和效率。综上所述,多队列网卡在发送和接收方面的作用包括提高并发性、流量控制、负载均衡以及提高吞吐量,从而有效提升了系统的网络性能和效率。- 提高吞吐量:通过并行接收多个数据流,系统可以更快地处理大量的数据,从而提高了网络接收的吞吐量。
2024-11-17 11:10:30
211
原创 linux根据uboot env分区参数生成相应分区
kernel根据uboot传递的env分区参数,生成对应的分区。以下以mtd分区mtdparts(spi nor)为例。1)解析cmdline的mtdparts。1. env中设置mtdparts。3. linux mtd分区。
2024-11-17 11:07:18
385
原创 SD卡插拔偶现mmc1: Controller never released inhibit bit(s).
2.4 在__sdhci_execute_tuning中,如果发生tuning timeout,先reset data&data,然后再继续tuning。解决:在__sdhci_execute_tuning中,如果发生tuning timeout,先reset data&data,然后再继续tuning。发送cmd19时,由于某种原因导致data & cmd inhibit,后续再发送cmd19便会失败。10ms timeout,如果10ms后,data & cmd还处于inhibit状态,则退出。
2024-11-17 11:00:58
680
原创 emmc接口是否能作为sd/sdio接口使用
xx soc只有一路sd接口,客户想使用sdio wifi,因此需要研究emmc接口是否能作为sd/sdio接口使用。IP(包括controller和PHY)一致,且IP配置也一致,拉出来的pad不同。还需要电压输入给pad,这个使用emmc所在的group即可。data_strobe,hw_reset不用。data_strobe,hw_reset不用。用gpio来作为power_switch。
2024-11-17 10:55:13
346
原创 mmc/sd/sdio linux休眠唤醒实现
for host controller,对于某些soc的sleep设计,suspend时IP会掉电并关clock,因此resume时需要重新初始化host。注:如果注释掉pm_runtime_enable,唤醒时不会调用mmc_sd_runtime_resume,sd会唤醒失败。resume时,通过pm_runtime机制来进行,延迟调用_mmc_sd_resume,因此resume耗时很短。注:但某些设计可能仅仅是关clock,IP不掉电,寄存器不清0,此时resume时仅仅恢复clock即可。
2024-11-17 10:52:11
619
原创 nor、nand flash文件系统的选择
对于 NAND 类型的闪存,选择合适的文件系统时需要考虑 NAND 闪存的一些特性,如高存储密度、较低的成本、快速的写入和擦除速度,以及对坏块的管理。- JFFS2 (Journaling Flash File System version 2):这是一种日志文件系统,特别设计用于闪存,能够有效地处理写入和擦除的限制,同时提供数据的完整性保护。选择哪种文件系统取决于具体的应用场景和需求。2. 较慢的写入和擦除速度:NOR 闪存的写入和擦除速度相对较慢,所以理想的文件系统应该尽量减少写入操作和擦除次数。
2024-09-22 21:00:59
1035
原创 linux命令行读写uboot环境变量
env分区为mmcblk0p7,offset为0,size为1024k(0x100000)可以选择保存env的设备和分区,如使用/dev/mmcblk0p7作为env分区。会自动保存到emmc/flash中。使用nor mtd4作为env分区。
2024-09-22 20:56:39
819
原创 Flash的读写机制
首先,选定的存储区域(通常是一个块)会被整体擦除,这意味着所有的位都被设置为1。4. 页与块的大小:NAND Flash的页大小通常是256B,512B,2048B,4096B,而块的大小是32K, 64K, 128K,这取决于具体的NAND Flash架构。3. 擦除操作:与NOR Flash类似,NAND Flash的擦除操作是按块进行的。由于其擦除操作是按块进行的,频繁的写入和擦除操作会逐渐降低特定块的可靠性。3. 擦除操作:NOR Flash的擦除是按块进行的,而不是单个字节。
2024-09-22 20:48:35
690
原创 uboot emmc读写API
1. emmc writeblk_dev_desc = blk_get_dev("mmc", EMMC_DEV_ID)get_part_info(blk_dev_desc, pfile->part_name, &part_info)emmc_switch_boot_part1(blk_dev_desc)blk_dwrite(blk_dev_desc, start_lba, blkcnt_lb, (void *)pfile->pbuf)emmc_switch_to_uda_part(blk_dev_desc)
2024-09-22 20:46:05
358
原创 uboot nand flash读写API
1. writeuclass_get_device(UCLASS_MTD, busnum, &dev)mtd = dev_get_uclass_priv(dev)mtd_arg_off(pfile->part_name, &idx, &partOff, &size, &maxsize, MTD_DEV_TYPE_NAND, mtd->size)mtd_erase(mtd, &erase_op)mtd_block_isbad(mtd, off)mtd_write(mtd, off, write_size, &
2024-09-22 20:43:41
412
原创 uboot nor flash读写API
mtd_arg_off(pfile->part_name, &idx, &partOff, &size, &maxsize, MTD_DEV_TYPE_NOR, flash->size) //获取mtd分区offset和size。
2024-09-22 20:42:32
359
原创 emmc、spi nor、spi nand三种flash 优缺点及应用场景
由于存储密度较大且制造成本相对较低,SPI NAND Flash适用于对成本要求很高的应用,但可能在速度和寿命上有一些妥协。SPI NOR Flash的制造成本较低,且适用于对成本敏感的应用,例如一些嵌入式系统。6. 主要应用:由于其优秀的随机读取性能,NOR闪存主要用于存储小容量的代码和数据,如引导程序和固件。由于其高集成度和大容量,制造和集成eMMC的成本相对较高。3. 写入和擦除速度较慢:与NAND闪存相比,NOR的写入和擦除速度较慢。2. 成本较低:NAND闪存的生产成本较低,每GB的成本也较低。
2024-09-22 20:36:33
1773
原创 linux pcie nvme存储架构
VFS为不同的文件系统提供一个统一的接口,使用户空间应用能够以一致的方式访问不同类型的文件系统。在这个过程中,各层之间紧密协作,确保了数据的有效写入,并充分利用了NVMe SSD的高速性能。- VFS接收到写请求,并根据文件所在的文件系统将请求定向到正确的文件系统驱动。- 它负责将数据组织成适当的格式,并更新文件的元数据(如大小、时间戳等)。- NVMe驱动程序是内核的一部分,负责处理NVMe SSD的低级控制。- 在这一层,实际的数据存储和检索操作发生,利用SSD的高速闪存技术。
2024-01-05 17:55:19
780
原创 嵌入式系统中的AB分区
在实践中,嵌入式设备会有两个独立的分区,即A分区和B分区。在任何时候,一个分区运行当前的操作系统,而另一个分区则用于下载和安装新的更新。更新完成后,系统会在下次启动时切换到包含新版本的分区,同时旧版本保留在另一分区作为备份。这种设计提高了系统的稳定性和可靠性,是现代嵌入式系统中常见的一种做法。嵌入式系统中的AB分区是一种重要的机制,主要用于确保系统更新的安全性和可靠性。这是因为旧的系统版本仍然保存在另一个分区中。1. 无缝更新:AB分区允许系统在后台下载和安装更新,而不影响当前运行的系统。
2024-01-05 17:52:47
2009
原创 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
917
原创 nor、nand flash文件系统的选择
对于 NAND 类型的闪存,选择合适的文件系统时需要考虑 NAND 闪存的一些特性,如高存储密度、较低的成本、快速的写入和擦除速度,以及对坏块的管理。- JFFS2 (Journaling Flash File System version 2):这是一种日志文件系统,特别设计用于闪存,能够有效地处理写入和擦除的限制,同时提供数据的完整性保护。选择哪种文件系统取决于具体的应用场景和需求。2. 较慢的写入和擦除速度:NOR 闪存的写入和擦除速度相对较慢,所以理想的文件系统应该尽量减少写入操作和擦除次数。
2024-01-05 17:47:11
1703
原创 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
1622
原创 行为驱动开发BBD
这种方法的核心在于使用清晰、易懂的语言(通常是英语)来描述软件应该如何行动,使非技术团队成员也能参与到软件的开发过程中。- BDD 则更注重于定义可执行的规范和验收标准,通常是通过编写格式化的场景和步骤(如“给定-当-然后”结构)来实现。1. 易懂的语言: 使用业务语言来描述软件行为,通常遵循“给定-当-那么”(Given-When-Then)的格式。- 增强沟通: BDD促进了技术和非技术团队成员之间的沟通,帮助确保所有人都对期望的软件行为有共同的理解。这些测试最初都是失败的,因为相应的功能还没实现。
2023-12-28 18:26:44
732
原创 测试驱动开发TDD
但在更复杂的场景下,这一步骤会涉及优化代码结构,提高代码效率,提升可读性和可维护性,同时保证测试依然通过。通过这个简单的例子,我们可以看到TDD的基本流程:首先编写一个针对新功能的失败测试,然后编写最小的代码量以通过测试,最后对代码进行重构以提高质量。3. 重构代码: 在测试通过后,进行代码重构,以改善代码的结构和清晰度,同时确保测试依然通过。这一步的目标是尽快通过测试,因此所写的代码可能并不完美。让我们通过一个简单的例子来说明测试驱动开发(TDD)的过程:假设我们需要开发一个函数,它用于计算两个数的和。
2023-12-28 18:25:40
475
原创 软件质量保证(SQA)
这三个方面涉及了软件开发的关键阶段:从理解和定义需求开始,通过测试和自动化来确保实现的质量,最后通过代码审查和持续改进来提高整体的工作效率和效果。这不仅关乎技术层面的执行,还涉及到组织文化和团队合作的方面,确保质量成为软件生命周期的核心组成部分。- 选用适当的工具来支持开发和测试工作,如集成开发环境(IDE)、测试框架、构建和部署工具等。- 通过全面的测试(包括单元测试、集成测试、系统测试和用户验收测试)来识别和修复错误。- 它涉及与客户的持续沟通和反馈,有助于及时调整方向,适应需求的变化。
2023-12-28 18:24:57
1094
原创 软件全面质量管理
软件全面质量管理(Software Total Quality Management,简称软件TQM)是一种管理方法,旨在通过持续改进过程、产品和服务来提高组织的质量和效率。通过培训、团队合作和有效沟通,确保每个员工都理解他们的角色如何影响最终产品的质量,并积极参与到质量改进的活动中。这要求组织不断寻找改进的机会,通过定期的回顾和评估,以及鼓励创新和改进的思维方式。通过这些方法,基于TQM的软件质量改进可以帮助组织更有效地满足用户需求,提高产品的竞争力,同时也促进内部流程的效率和效果。
2023-12-28 18:23:51
651
原创 emmc、spi nor、spi nand三种flash 优缺点及应用场景
由于存储密度较大且制造成本相对较低,SPI NAND Flash适用于对成本要求很高的应用,但可能在速度和寿命上有一些妥协。SPI NOR Flash的制造成本较低,且适用于对成本敏感的应用,例如一些嵌入式系统。由于其高集成度和大容量,制造和集成eMMC的成本相对较高。- 依然适用于嵌入式系统,尤其是对存储容量和成本敏感的应用,如一些物联网设备。选择合适的Flash类型应基于具体应用需求,考虑性能、功耗、寿命、成本和集成度等因素。- 较长的寿命,适用于需要频繁读写的场景。- 相对较高的功耗和复杂性。
2023-12-11 18:19:41
3355
原创 WiFi理论速率计算
Wi-Fi在传输时,根据空口环境的好坏,会加入不同数量的纠错码,用来提高传输的可靠性,空口环境越差,纠错码越多,数据占比越少,码率越低,反之亦然。传输时间是传输一个Symbol需要的时间加上一个间隙(GI)。Wi-Fi理论速率=编码方式*码率*最大信道有效子载波数量*单位时间符号传输数量(1/符号传输周期)*空间流数量。我们以最高码率(5/6)、最大空间流(8*8)、最大频宽(160M)来计算一下11ax的最高速率。Wi-Fi理论带宽 =(符号位长×码率×子载波数量)÷ 传输时间 ×空间流。
2023-12-07 17:45:45
2268
原创 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
678
原创 AP6256 wifi驱动linux开发及验证
build ko{ …} else#endif#endif0x02d00xaaecpmf=1network={7.4ping。
2023-12-07 17:39:45
926
原创 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
47020
1
原创 插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
3555
原创 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
460
原创 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
369
原创 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
2833
1
原创 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
921
原创 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
403
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人