
由浅入深学习嵌入式Linux driver开发
文章平均质量分 83
记录实际学习Linux开发的过程,环境搭建,u-boot,kernal构成,设备树,device driver驱动开发,user space层面的应用开发,由浅入深,逐渐深入理解linux。
芯片-嵌入式
专注芯片技术使用,包括国外国产、车规工规、硬件软件、内核外围、应用实现。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
汽车IVI中控OS Linux driver开发实操(二十四):CCF通用时钟框架
时钟框架已经存在很多年了,为设备驱动程序的使用提供一些简单的API:clk_get、clk_enable、clk_get_rate、clk_set_rate、clk_disable、clk_put。复杂的硬件时钟必须分为基本时钟,例如,具有固定速率的门时钟将由作为门时钟的父级的固定速率时钟组成。2、set_parent:更改此时钟的输入源,在parent_name或parents数组中接收的索引,clk_set_rent()转换索引中的clk。1、round_rate:返回时钟实际支持的最接近的速率。原创 2024-04-25 21:31:50 · 149 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(二十三):音频ASOC的设计开发
ALSA片上系统(ASoC)层的总体项目目标是为嵌入式片上系统处理器(如pxa2xx、au1x00、iMX等)和便携式音频编解码器提供更好的ALSA支持。->没有标准的方法来向用户发起的音频事件发出信号(例如,耳机/麦克风插入、插入事件后的耳机/麦克风检测)。它处理任何特定于机器的控制和机器级音频事件(例如,在播放开始时打开放大器)。->动态音频电源管理(DAPM)。:平台级驱动器包括音频DMA引擎驱动器、数字音频接口(DAI)驱动器(例如I2S、AC97、PCM)和该平台的任何音频DSP驱动器。原创 2024-04-25 11:04:20 · 198 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(二十二):写一个ALSA驱动程序
如何编写ALSA(高级Linux声音体系结构)驱动程序?比如PCI声卡。在其他设备类型的情况下,API也可能有所不同。然而,至少ALSA内核API是一致的。对开发者而言需要具备足够的C语言技能和基本的linux内核编程知识。什么时在ALSA上编写PCI声音驱动程序的标准方法?原创 2024-04-24 11:56:30 · 384 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(二十一):linux device driver basic设备驱动程序基础
linux的架构框图:内核空间是内核(即操作系统的核心)执行(即运行)并提供其服务的地方。用户空间是执行用户应用程序的地方。内核模块是可以根据需要加载和卸载到内核中的代码片段。它们扩展了内核的功能,而无需重新启动系统。自定义代码可以通过两种方法添加到Linux内核中。->基本方法是将代码添加到内核源代码树并重新编译内核。->一种更有效的方法是在内核运行时将代码添加到内核中。这个过程称为加载模块,其中模块指的是要添加到内核中的代码。原创 2024-04-24 11:04:10 · 326 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(二十):PINCTRL子系统
PINCTRL子系统处理:1、枚举和命名可控引脚2、引脚、焊盘、指状物(等)的多路复用3、引脚、焊盘、指状物等的配置,如软件控制的偏置和驱动模式特定引脚,如上拉/下拉、漏极开路、负载电容等。PIN CONTROLLER控制器的定义:引脚控制器是一块硬件,通常是一组寄存器,可以控制引脚。它可以对单个引脚或引脚组进行多路复用、偏置、设置负载电容、设置驱动强度等。PIN的定义:PINS等于焊盘、手指、球或想要控制的任何封装输入或输出线,这些都由0...maxpin范围内的无符号整数表示。原创 2024-04-22 23:25:51 · 293 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(十九):Nand Flash驱动的实现
nand flash从硬件连接上看,如下图,有专用接口,数据线有8或16根。Nand Flash按每个存储单元Cell内存储比特个数不同可分为 SLC(Single-Level Cell存储1个比特)、MLC(Multi-Level Cell存储2个比特) 、 TLC(Triple-Level Cell存储3个比特)、QLC(Quad-Level Cell存储4个比特)四大类,比特位越多,读写性能会越差,寿命也越短,但成本更低。原创 2024-04-22 21:58:50 · 472 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(十八):Linux音频ALSA开发
应用程序程序员应该使用库API,而不是内核API。alsa库提供了内核API 100%的功能,但增加了可用性方面的主要改进,使应用程序代码更简单、更美观。未来的修复程序或兼容性代码可能会放在库代码中,而不是放在内核驱动程序中。用来打开一个pcm音频设备,并得到这个音频设备的句柄, 即便用户使用了alsa的插件,使用时也同样是使用此接口,非常方便。通常是接触alsa-lib的第一个api,也通常是使用alsa进行录音或播放的第一步。正如名字中表示的一样,原创 2024-04-21 23:16:33 · 350 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(十七):Linux Media Infrastructure userspace API
一旦应用程序分配了流式数据所需的内存缓冲区(通过调用ioctl VIDIOC_REQBUFS或ioctl VIDIOC_CREATE_BUFS ioctls,或通过隐式调用read()或write()函数),该应用程序(文件句柄)就成为设备的所有者。由于V4L2涵盖了各种各样的设备,因此API的所有方面都不适用于所有类型的设备。此外,同一类型的设备具有不同的功能,ioctl VIDIOC_QUERYCAP ioctl可用于检查内核设备是否与规范兼容,并查询设备支持的函数和I/O方法。设备可以支持多种功能。原创 2024-04-21 22:46:58 · 426 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(十六):Linux驱动模型driver model
驱动程序绑定是将设备device与可以控制它的设备驱动程序driver相关联的过程。总线驱动程序bus driver通常会处理,因为有特定于总线bus的结构来表示设备device和驱动程序driver。使用通用的设备device和设备驱动程序driver结构,大多数绑定都可以使用通用代码进行。原创 2023-09-05 15:24:17 · 352 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(十五):nand flash接口开发(2)
因此,我们需要利用这个kobject基础设施,让我们的设备和相应的驱动程序显示在sysfs中,并在一些设备属性/属性上定义读/写操作。因此,支持NAND的文件系统必须在页面大小的块中写入,或者保留一个写缓冲区来收集较小的写入,直到它们加起来达到页面大小。如果硬件接口的NAND芯片的(就绪繁忙引脚)连接到GPIO或其他可访问的I/O引脚,则此功能用于读取引脚的状态。“name”是sysfs中的设备/目录名,“parent”是该设备的父设备/目录,“kset”是一组相同类型的所有kobject。原创 2023-09-04 14:35:15 · 249 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(十五):nand flash接口开发
flash memory,分NAND和NOR:如果说nor flash有个特点就是能执行代码,NOR并行接口具有地址和数据总线,spi flash更是主要用于存储代码,SPI(或QSPI)NOR代码可就地执行(XiP),一般系统要求flash闪存提供相对较高的频率和数据缓存的clocking。而nand flash主要用于存储,要执行代码,需要拷贝到SRAM中执行。从下表可以看出,NOR更小更快更适合存放或运行源代码,而NAND flash更大适合存放数据。原创 2023-08-30 22:55:29 · 518 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(十四):SPI接口开发
SPI()同UART、I2C、CAN等一样,是MCU/SOC的重要接口,没错,它是个通讯接口,一个串行通讯接口,我们想到了四线接口(CS、CLK、MOSI、MISO)可以通过CS(ChipSelect)或者SS (Slave Select)线来选择和哪个SPI设备通信,选择就是把这条线拉低一段时间。原创 2023-08-30 12:33:18 · 336 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(十三):GPIO接口开发
具体操作如下图:但这个接口有些缺点,比如缺乏批量GPIO读写、GPIO配置选项有限(如:无法将GPIO配置为低电平、漏极开路、开源等),当两个或多个进程同时访问同一GPIO时,可能会出现竞争条件问题,GPIO的轮询事件不可靠等。从4.8版本开始,Linux内核引入了一个新的基于字符设备chardev的用户空间GPIO接口。原创 2023-08-29 16:01:59 · 280 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(十二):PWM接口开发
对下,为各种硬件平台提供pins定义、控制方式注册接口。硬件就是一片内存寄存器,这些寄存器可以配置pins,完成诸如复用(multiplex)、上/下拉配置(bias)、负载能力(load capacitance)、驱动能力等。实际使用效果如下,可以通过shell指令将开发板对应的LED灯点亮。原创 2023-08-24 22:40:18 · 412 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(十一):ETH网络接口开发
嵌入式linux也有些是支持网口的,比如RGMII,嵌入式系统资源支持以太网和其他基本接口的硬件平台(板上或片上系统),有充足的NOR或NAND Flash闪存,用于容纳OS、lib库、fileSystem文件系统、APP应用程序、Bootloader引导程序等。嵌入式Linux是开源的、可修改的,并且是用C编写的,可以根据需要额外根据添加的硬件芯片设备而对应增加驱动程序以供上层应用层应用程序使用。原创 2023-08-24 21:57:10 · 504 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(十):ADC接口开发
ADC就是模数转换,可以用来接一些模拟量设备,所谓模拟量就是波形不是方波而是各种包络形状的波形的信号,比如电压、电流等电信号或压力、温度、湿度、位移、声音等非电信号,ADC就是将这些信号转换为数字方波信号,以便于信息传递的。原创 2023-08-24 12:19:15 · 451 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(九):CAN接口开发
CAN网络在汽车中的使用可以说相当广泛。原创 2023-08-17 15:11:59 · 879 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(八):UART串口开发
串口可以说是非常好用的一个接口,它同USB、CAN、I2C、SPI等接口一样,为SOC/MCU构建了丰富的接口功能。那么在嵌入式linux中又是如何搭建和使用UART接口的呢?原创 2023-08-14 23:55:27 · 2644 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(七):内核驱动程序kernal device driver
嵌入式linux启动: 对于kernal: 内核设备驱动程序是底层硬件面向系统的其他部分的机制,系统有一些新的硬件,必须找到访问它们的方法,内核的功能之一是封装计算机系统的许多硬件接口,并以一致的方式将它们呈现给用户空间程序。内核设计了便于编写设备驱动程序的框架,设备驱动程序是在上面的内核和下面的硬件之间进行中介的代码片段。一个设备驱动程序可能被写入用来控制物理设备,如UART或MMC控制器,或者它可能表示一个虚拟设备,如空设备(/dev/null)或r原创 2023-07-18 23:32:36 · 389 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(六):Flash存储及FileSystem文件系统
嵌入式设备的大容量存储选项在健壮性、速度和现场更新方法方面对系统的其他部分有很大的影响。大多数设备都采用了某种形式的闪存技术。在过去的几年里,随着存储容量从几十兆增加到几十g,闪存变得便宜得多。对于每个flash技术,都有不同的文件系统选择。原创 2023-07-18 11:01:23 · 522 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(五):embedded linux嵌入式Linux开发
embedded linux开发有个好处就是开源的,总的来说涉及五个部分:1、工具链Toolchain:为目标设备创建代码需要的编译器和其他工具。其他一切都取决于工具链。2、引导程序Bootloader:它初始化板并加载Linux kernal。3、内核kernal:这是系统的core核心,管理系统资源和各种硬件接口。4、根文件系统root filesystem:包含一次性运行的初始化的lib库和program程序。5、应用embedded application。原创 2023-07-14 12:00:12 · 570 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(四):pinctrl和dt_binding
配置和控制I/O,GPIOLib主要用于一个pin引脚在runtime时的控制, IO端口也被称为pins或pads,是焊接在PCB上与芯片外部的物理连接。1、一个pin引脚(或一组pin引脚)由硬件块控制,然后pinctrl将应用device tree设备树给出的引脚配置(注意是:应用)架构就是实现这个功能的。许多MCU pin具有数字I/O或模拟I/O,有的还要多路复用。2、pin引脚需由软件(通常是GPIO)控制,然后GPIOLib框架将用于在pinctrl框架之上控制该引脚。2、通过调试提供信息。原创 2023-07-13 09:32:51 · 429 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(三):文件结构
说的专业点就是buildroot 是linux平台下的一种构建嵌入式Linux系统的框架。它可以认为是一个大的编译工程,由Makefile脚本和Kconfig配置文件构成。只给u-boot或linux kernal使用吗?当然不是,它两个都服务。所以它功能很强大,换句话说,如果u-boot或者linux kernal有新增文件都要告知buildroot,以便编译进去。嵌入式Linux开发,基本主要的文件结构就是下面这个图,可以看到主要有三个部分组成:Buildroot、linux和u-boot。原创 2023-07-06 12:28:42 · 254 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(二):uboot+kernal开发
在设备树出现之前,Linux内核通常包含特定于电路板的代码,比如设备的地址。u-boot将初始的硬件初始化,如基本的处理器(CPU)设置,初始化时钟和计时器,初始化控制台等。为了能够在操作系统中使用硬件设备(UART,USB,PCIe,SD卡,codec),需要一个设备驱动程序。上电后,芯片将开始执行其启动固件,它就是uboot,主要目的是加载一个程序,然后在芯片上运行它,uboot通过查看引导模式寄存器、保险丝Fuses或GPIO引脚的状态来确定从哪里加载程序,比如从从eMMC flash启动。原创 2023-07-06 01:03:51 · 493 阅读 · 0 评论 -
汽车IVI中控OS Linux driver开发实操(一):DeviceTree设备树解析
boot program要装载它,它显然是个规范的东西,不是自定义的,它显然是个树型结构,用来描述系统硬件的,有很多的结点node,每个结点有一个父结点,结点是property/value pairs属性+值。结点可能是实际硬件设备如UART,也可能是个虚拟设备,如提供对连接到远程CPU的I2C设备的访问的协议,虽然结点不是必须是个硬件设备,但通常都会关联物理硬件设备,它不是专为某个os或者项目的,而是任何OS或项目可用的那种,结点一般是client program不能动态检测到的。它们应被明确地定义。原创 2023-07-05 14:42:02 · 428 阅读 · 0 评论 -
Ubuntu20.04下PuTTY工具安装及使用
很显然,需要知道自己用的是哪个串口,/dev/ttySn(一般为/dev/ttyS0)表示串行端口终端,接串口线使用的端口设备,/dev/ttyS0一般表示COM1,/dev/ttyS1表示COM2。Putty、TeraTerm、SecureCRT和SSCom等一样,我一般当做串口工具使用,对于有些linux环境,按下空格键就能进入到uboot的linux环境来说,前三个工具可能更加好用,而直接输入USB转串口指令的情况SSCom用起来不错。打开后如下,如果设备会有该端口的输出,则会打印出一些输出信息。原创 2023-03-28 20:52:20 · 3928 阅读 · 0 评论 -
Ubuntu安装OpenSSH让向日葵可以远程控制
同样的向日葵工具,windows远程windows没有问题,linux总是卡在建立远程连接一步,估计是linux的远程协议不对。经过几天研究,发现可能是xrdp,也可能是openssh。XRDP的安装不介绍了,主要是服务启动。OpenSSH的安装。原创 2023-03-27 16:39:49 · 2236 阅读 · 0 评论