![](https://img-blog.csdnimg.cn/20210509065842228.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
嵌入式:软件硬件接口
文章平均质量分 64
通用核心技能,要求掌握
hinzer
HINZER,坐标北京,我在芯片设计行业,目前做 GPU 固件和驱动开发,对嵌入式 OS 感兴趣。
展开
-
数字版权管理(DRM)概念
数据流从服务器传输到设备端是加密的形式,数据流在设备上进行解密/解码/合成/播放,比如手机在播放视频的时候,如果软硬件不支持 DRM,在播放视频的时候就会受到限制。DRM 保证数据流的安全。原创 2023-01-18 19:05:45 · 685 阅读 · 0 评论 -
Linux内核移植 | 制作 rootfs
Linux内核启动后,需要挂载根文件系统。本章介绍文件系统的制作过程,留几个参考链接。1)自动生成: RAMDIRK。2)手工制作: ROOTFS。原创 2022-12-24 17:22:33 · 310 阅读 · 0 评论 -
Linux驱动开发 | 设备树的定义和获取
概述在Linux 2.6中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备、resource、i2c_board_info、spi_board_info以及各种硬件platform_data。常见的s3c2410、s3c6410等板级目录,代码...原创 2018-11-29 15:57:09 · 2471 阅读 · 2 评论 -
Linux驱动开发 | IIC 子系统
本章通过IIC子系统软件框架,实现驱动让应用层I2C读取从设备的功能。硬件上,通过I2C主控制器读取mpu6050陀螺仪和加速度数据信息。简介I2C(Inter-integrated Circuit)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它只需要两根信号线来完成信息交换。I2C最早是飞利浦在1982年开发设计并用于自己的芯片上,一开始只允许100kHz、...原创 2018-11-27 14:41:23 · 1333 阅读 · 0 评论 -
Linux驱动开发 | 输入子系统+2
利用驱动的中断机制,可以捕获按键按下时产生的中断事件,然后将信息上报给输入子系统,由子系统将数据交给用户。将不同按键设备的信息,描述到设备树中,驱动程序遍历每一个节点即设备对象;利用中断子系统实现对多个按键产生的数据,进行上报。重点是驱动代码的设计处理,通过设备树节点将设备信息读取到结构体数组成员中,兼容多个硬件设备,体现到代码重用的思想。如果要添加一个按键设备,只要在原有的基础上添加一个设备...原创 2018-11-25 20:25:59 · 1250 阅读 · 1 评论 -
Linux驱动开发 | 输入子系统+1
简单回顾一下之前学习的驱动知识。基于之前的学习,首先实现了字符驱动框架的编写,实现模块化的驱动,简单的加载/卸载去动态执行驱动程序。对于应用层<——>驱动层,编写file_operations使驱动对上层应用层提供接口,实现功能机制让用户可以通过阻塞、非阻塞、多路复用或者异步通信的方式从驱动读设备;对于驱动层<——>硬件层,通过地址映射机制读写硬件的寄存器,实现对硬件的控...原创 2018-11-24 21:48:07 · 967 阅读 · 0 评论 -
Linux驱动开发 | 平台总线模型
linux内核支持platform平台总线,这是一种虚拟总线,满足之前讲的设备驱动模型。这里使用平台总线platform是区别于之前我们用手动创建mybus总线,同样完成设备与驱动分离的实现。设备、驱动、总线三者关系:由于平台总线的设计是基于设备模型的,引入平台总线,实现device(中断/地址)和driver(操作逻辑)分离在硬件升级的时候,只需要修改device中信息即可(...原创 2018-11-21 21:03:20 · 1254 阅读 · 1 评论 -
Linux驱动开发 | 设备驱动模型
按照之前的实现驱动的方法。对于同一类设备,驱动层实现的操作方法是相似的,而设备信息总是不同的,一个产品上有很多这样的同类设备,我们为每一个设备都定制一套驱动程序,代价似乎太“高昂点”;对于一个设别,如果硬件有所改动,也必然要修改取代代码。为了提高代码的通用性,我们将驱动和设备进行分离,设备对象专门用来描述设备(硬件)的信息。而驱动负责重设备中获取这些硬件描述,主要用来实现操作方法。总线负责将两...原创 2018-11-20 19:53:28 · 1034 阅读 · 1 评论 -
Linux驱动开发 | 中断优化
ARMcortex-A系列的内核不支持中断嵌套。在内核中断函数中,如果中断处理时间过长,产生中断嵌套,重者系统崩溃,轻者也会影响其他事件处理。这也是中断中不能使用延时函数的原因。但是有些高实时性设备(比如网卡),就是需要处理大量的业务。为了满足中断处理时间尽量短的原则,我们将一些简单的处理放在中断中实现,这个阶段叫做中断的上半部;其他一些复杂、耗时间的操作丢给内核线程,让内核来调度其执行,这...原创 2018-11-18 18:20:38 · 926 阅读 · 1 评论 -
Linux驱动开发 | 异步通信+中断
对于linux一切都是文件,驱动设备在应用层也是以文件的形式进行读写。之前学了阻塞、非阻塞、多路复用的方式读设备,它们都需要应用主动读取。那么应用层有没有一种方式,当底层将数据准备好了,应用程序自动处理这些数据?通过异步通信可以实现,这有写类似硬件层的中断概念驱动层(准备好了数据) --> 发送特定信号 --> 应用程序(跳转到与之匹配的函数入口) --> 处理数据........原创 2018-11-18 18:13:40 · 975 阅读 · 0 评论 -
Linux驱动开发 | 多路复用+中断
使用阻塞模型虽然可以避免等待数据过程中,CPU对进程的消耗,但是仅仅是为了等待这一个结果,就让进程进入休眠,对于还要进行其他IO操作的进程而言太“奢侈”。所以引入多路复用的概念,解决这个问题。非阻塞:立即返回结果,如果想得到期望的结果,要不停的调用这个方法(轮询),非常耗费资源阻塞:没有得到真正的数据前,不返回结果。此时,进程进入阻塞(休眠)态,直到有数据唤醒进程,这个过程不耗资源。多...原创 2018-11-17 20:54:04 · 894 阅读 · 1 评论 -
Linux驱动开发 | 阻塞模式+中断
目前已经学习两种应用层IO模型的使用:立即返回结果,如果想得到期望的结果,要不停的调用这个方法(轮询),非常耗费资源:没有得到真正的数据前,不返回结果。此时,进程进入阻塞(休眠)态,直到有数据唤醒进程,这个过程不耗资源。PS:linux应用中,大部分的函数接口都是阻塞。原创 2018-11-17 20:53:57 · 1513 阅读 · 1 评论 -
Linux驱动开发 | 非阻塞模式+中断
当中断发生时,驱动程序会跳转到中断处理的函数入口,实现了中断的捕获和处理,但这样还不够。要让用户能够获取到中断分析的结果,我们将创建一个描述中断事件的结构体对象。硬件产生中断后,驱动代码将对中断事件的分析结果保存在结构体变量中,用户需要的时候,直接通过接口函数获取这个结构体的数据。:根据之前学到的和,再进一步对之前的程序调整,便有了这个程序。对于内核层,当有中断事件,去驱动程序跳到处理函数并将中断信息保存在定义的结构体中;原创 2018-11-16 19:04:05 · 1063 阅读 · 1 评论 -
Linux驱动开发 | 中断实现
在通过原理图,芯片手册查询,从硬件连接最终定位到中断号通过源码,系统设备树描述中每一个设备的节点都要有一个compatible属性 ,用来查找节点(也可以通过节点名或节点路径查找指定节点);interrupt-parent表示结点继承至gic。};手动定义设备树节点,参考上面的系统描述和硬件设备号。定义如下};重新编译设备树,并更新tftp根目录下的设备树文件make dtbs。原创 2018-11-16 19:03:53 · 1324 阅读 · 0 评论 -
Linux驱动开发 | 编写字符驱动步骤总结
b,创建设备节点文件 (为用户提供一个可操作到文件接口--open())a, 申请主设备号 (内核中用于区分和管理不同字符设备)3,实现硬件的寄存器到初始化。e,实现file_operations。1,实现模块加载和卸载入口函数。2,在模块加载入口函数中。原创 2018-11-14 20:34:51 · 813 阅读 · 0 评论 -
Linux驱动开发 | 代码规范
前面笔者已实现了用户程序控制led灯闪烁的驱动代码,但是由于代码不规范,显得乱七八糟的,因此需要规范化。如果比较大一点的工程没有规范的话,也不利于后期的跟新与维护。分析先前的程序不规范点有二:定义的变量多而且散乱 程序没有错误处理机制C语言虽然是面向过程的语言,但是可以利用结构体来实现面向对象的思想。通过引入面向对象的思想,来解决第一个问题。通过结构体将将相关的变量类型进行一次封装,构造出...原创 2018-11-14 20:32:28 · 1258 阅读 · 1 评论 -
Linux驱动开发 | 点灯实验
完成应用程序通过驱动控制硬件的实现。实验建立在之前的框架上,我们先实现用户层与内核层之间的数据交互,驱动程序拿到用户传来的指令后,就可以执行点灯的动作了。原创 2018-11-14 20:31:00 · 1827 阅读 · 0 评论 -
Linux驱动开发 | 实现字符驱动
Linux系统根据驱动程序实现的模型框架将设备驱动分成字符设备驱动、块设备驱动、网络设备驱动三大类。这里简单理解一下概念。原创 2018-11-13 21:24:44 · 1491 阅读 · 1 评论 -
Linux驱动开发 | 模块驱动
应用层的进程是通过内核层驱动来访问硬件的,Linux内核源码在每次编译之后生成一个总的镜像,将镜像加载内存中运行并使用(内核在系统运行时会占用内核空间)。驱动属于内核源码的一部分,如果每次修改驱动都要重新编译加载内核的话,这太麻烦了,所以我们通过模块,使驱动可以独立于内核镜像之外,并能动态的加载和卸载。在搭建好开发环境之后,通过source insight我们可以方便的查看和编辑内核源码,并结合交叉编译工具链实现编辑--编译--烧录--执行 的完整开发流程。原创 2018-11-12 19:56:53 · 2625 阅读 · 1 评论 -
Linux内核移植 | 驱动移植(黑盒)
由于嵌入式系统分层,应用层要想操作硬件需通过内核层。驱动对上提供系统调用函数,对下封装了对底层硬件的一些基本操作。笔者目前不了解驱动程序的编辑,所以本章是在已经有驱动程序(fs4412_led_drv.c)和对应的应用程序(fs4412_led_app.c),来实现黑盒子移植(不去理解驱动程序的细节),实现控制led灯的闪烁。led驱动程序fs4412_led_drv.c led控制程序...原创 2018-11-09 18:54:46 · 1292 阅读 · 1 评论 -
Linux内核移植 | 内核移植
home/linux/soft/ 是工具链的路径,添加到PATH的头部;写入/etc/bash.bashrc 中保证重启机器后变量仍然有效。通过串口配置U-Boot的启动参数,让U-Boot通过tftp服务获取uImage和 exynos4412-origen.dtb。ps:如果提示缺少库,使用apt-get install下载即可。至此没有异常的话可以正常启动 linux, 但是挂载不了根文件系统,因为没有配置网卡驱动。首先将在Ubuntu环境中,添加交叉编译工具到PATH变量,永久有效。原创 2018-11-07 18:11:30 · 1522 阅读 · 1 评论 -
Linux内核移植 | 配置和编译内核
现在Linux内核源码的ARM体系结构已经引入了设备树的概念。设备树是描述硬件的数据结构,将之前配置在内核源码中的一部分提取出来。所以分别对内核和设备树文件进行配置和编译。本章节仍然以三星的exy4412芯片为例。通过内核的配置文件可以对内核进行配置,可以通过make menuconfig来进行图形化配置 设备树文件描述CPU与外围硬件的配置和连接信息,在arch/arm/boot/dts...原创 2018-11-07 18:11:16 · 1843 阅读 · 1 评论 -
Linux内核移植 | 认识Linux内核
从技术上说 linux 是一个内核,而一个内核不是一套完整的操作系统。通常我们使用的 linux 系统是一个集 linux 内核、工具集、各种库、桌面管理器、应用程序等一体的一个发布包 (发行版)。对于一个嵌入式产品,应用要在系统上运行。小公司看中成本,中小级别公司产品是否可以二次开发,大型公司更看中产品提供的服务是否安全稳定。而Linux内核的免费、开源、高可靠性、支持硬件平台广泛恰好符合都有要求。linux 各个版本下载地址。原创 2018-11-07 18:11:01 · 1245 阅读 · 1 评论 -
Linux内核移植 | 分析UBOOT
我这边开发板使用了三星的exynos4412芯片,它比较特殊的之处是,启动分为4个阶段:BLx是三星公司在U-Boot中剥离出去的一部分,BL0固化在iROM中,BL1、BL2也不会开放源码。制作U-Boot需要使用三星提供的BL1 BL2添加到u-boot.bin的前面。。。下面我们需要分析U-Boot在CPU上的启动过程U-Boot可以存放于Flash或SD卡等非易失性存器上,CPU上电需要跳转到U-Boot起始位置,运行时要拔U-Boot搬移到内存。主要做了 初始化硬件和引导内核 这两件事情。原创 2018-11-05 19:48:57 · 896 阅读 · 0 评论 -
Linux内核移植 | 认识U-BOOT
不同种类 Bootloader 特点不同,目前最广泛应用的就是 U-Boot 了。:U-Boot是目前Bootloader中使用率最高的一种,特点是开源免费,应用广泛。U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。一般从官方或者厂家拿到UBoot后,先对其修改配置,然后将移植好了的UBoot制作到EMMC或者SD卡中,然后产品上电的时候就能直接加载了。交互模式下,可以通过命令对U-Boot进行变量参数配置。原创 2018-11-05 19:48:25 · 875 阅读 · 0 评论 -
Linux内核移植 | 开发环境
在嵌入式产品中,操作系统充当硬件资源的管理员的角色,对下有硬件层采集信息或者执行功能,对上还需为应用程序提供适合的API接口以便调用。有着承上启下的重要作用。具体硬件产品用公司或者提供商设计,移植系统时,上层跑什么应用程序也不必操心,我们需要根据硬件定制一个平台。应用程序不能直接去操作硬件(裸机开发不带操作系统),不然就太不安全了,也不方便管理。Linux内核的免费开源和可剪裁性以及开源稳定...原创 2018-11-04 21:51:57 · 3555 阅读 · 2 评论 -
汇编语言 | 裸机驱动开发
最简例子 以流行的FS4412单片机为例,实现LED灯控制。原创 2018-09-21 06:26:11 · 1546 阅读 · 1 评论 -
汇编语言 | 软中断机制
CPU会自动识别产生的异常,并将当前的PC值定位到异常向量表的某一个位置,但是由于异常的产生是随机的,我们并不知道什么时间会出现在什么类型的异常,所以需要一个异常向量表(也有说是中断向量表),来完成对不同异常处理函数入口地址的映射。中断也是异常的一种,中断有硬中断(由硬件产生的中断)和软中断(软件产生的中断)之分。ARM有七种不同的中断源,在中断向量表中对应的地址范围是 0X00 ~ 0X1C ,本章只介绍软中断。执行由SWI指令 产生,用于用户模式下的程序调用特权操作指令。简单实现软中断。原创 2018-09-19 22:42:21 · 3351 阅读 · 1 评论 -
汇编语言 | 读写物理地址
load/store架构规定,存储器之间不能直接拷贝,需通过寄存器做中转。于是我们通过LDR指令存储器中的数据到寄存器;STR指令将寄存器中的数据写到存储器。我们实现从存储器Flash(srcBuf)中数据到R0寄存器,再将这个数据送到RAM内存地址空间中。所以说,srcbuf在代码段 flash里,destbuf在数据段 ram里。text里是代码段,代码段表示控制语句部分,内容存储在flash.。我们通过例程来实现读写寄存器这一过程。data里是数据段,数据段表示是变量等,内容在内存里。原创 2018-09-18 20:35:38 · 3447 阅读 · 1 评论 -
汇编语言 | 函数调用
如果我们要实现一个汇编代码,通常先实现一个功能相识的C代码,然后再写汇编代码。原创 2018-09-18 20:34:33 · 2305 阅读 · 1 评论