
Linux驱动
文章平均质量分 71
嵌入式底层驱动
嵌入式_笔记
!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ARM裸机 - ARM体系架构
处理器架构指的是处理器的内部结构和功能,也就是处理器如何执行指令和数据的方式。不同的处理器架构有不同的指令集,也就是处理器能够理解和执行的基本操作。处理器架构对于处理器的性能、功耗、兼容性等方面有重要的影响。常见的架构有x86、ARM、RISC-V和MIPS。X86:这是英特尔和AMD的“专属”架构,主要用于PC、服务器和云计算领域,拥有高性能、高速度和高兼容性的优势。在PC市场上,X86架构几乎独霸多年,占据了超过90%的份额。原创 2024-10-20 23:58:19 · 1385 阅读 · 0 评论 -
从零写最简单shell
1.shell是什么shell就是壳的意思,在计算机中经常提到shell是用户操作接口的意思。两种shell:GUI和cmdlineGUI(图形用户界面),特点是操作简单、易学易用,适合使用电脑来工作的人。cmdline(命令行界面),譬如linux的终端和windows的cmd,特点是不易用易学,优点是可以进行方便的shell编程,适合做开发的人。shell的运行原理:由消息接收、解析、执行构成的死循环。2.从零写shell,使用printf和scanf做输入回显#i原创 2021-09-26 15:38:49 · 287 阅读 · 0 评论 -
图像解码播放器
1.开发环境硬件:PC(主机Win7 X64,虚拟机ubuntu14.04) + 开发板(X210)软件:linux(直接基于linux API)开发板uboot(uboot可以在iNand中,也可以在外部SD卡中)。移植好的内核(zImage在tftp服务器中,或者zImage直接fastboot方式烧录到iNand中)。自己做的rootfs。2.Makefile介绍这是一个通用的项目管理的Makefile体系,自己写的分子文件夹组织的项目可以直接套用这套Makefil原创 2021-10-07 16:46:12 · 1445 阅读 · 0 评论 -
Makefile编译原理 打造专业的编译环境
一.打造专业的编译环境原创 2024-02-11 22:33:40 · 475 阅读 · 0 评论 -
Makefile编译原理 make 中的路径搜索_2
如果失败:make优先在vpath指定的文件夹中搜索目标文件,当vpath搜索失败时,转而搜索VPATH执行的文件夹。将 src/func.c 改为 src1/func.cpp 会发生什么?实验1 VPATH 和 vpath 同时指定搜索路径。VPATH变量和vpath关键字同时指定搜索路径。- make首先在当前文件夹搜索需要的文件。原创 2024-02-11 14:39:11 · 580 阅读 · 0 评论 -
Makefile编译原理 make 中的路径搜索_1
但是inc 中的文件是我们手误放进去的,所以不是我们想要的结果,那么这种情况怎么办呢?$(OBJS) : %.o : %.c func.h // 为 make 解释器提供搜索路径 :VPATH := $(INC) $(SRC) ,这样make解释器就得到了需要的文件,并根据规则中的模式替换,生成了最后的规则。原因:VPATH 只能决定 make 的搜路径,无法决定命令的搜索路径,他对命令没有任何作用,上面得到的编译错误是因为 gcc 在编译.c文件的时候找不到对应的头文件。.c文件到 src文件夹中去找。原创 2024-02-11 13:47:38 · 641 阅读 · 0 评论 -
Makefile编译原理 make的隐性规则
隐式规则可能造成意想不到的编译行为。在实际工程项目中尽量不使用隐式规则。后缀规则是一种旧式的模式规则。后缀规则正逐步被模式规则取代。原创 2024-02-08 18:55:55 · 1117 阅读 · 0 评论 -
Makefile编译原理 makefile中的include关键字
第二次执行 make all的时候,include关键字找到了 对应的test,txt文件,于是将 test.txt文件里面的内容拷贝过来了,就没必要再去执行 对应的规则了。第一次执行 make all 时候,执行include关键字 所对应的规则,打印字符串病创建 test.txt文件。结果在当前目录生成了test.txt文件。搜索失败:产生警告,并以文件名作为目标查找并执行对应规则。搜索成功:将文件内容搬入当前makefile中。将其他文件的内容原封不动的搬入当前文件。类似C语言中的include。原创 2024-01-30 22:19:36 · 1097 阅读 · 0 评论 -
Makefile编译原理 自动生成依赖关系
因为这个makefile 并没有考虑目标文件对头文件的间接依赖,所以说 就算改动了头文件,make 也不知道,makefile 中描述的规则只会去查看源文件是否比目标文件更新,结果源文件没改动,所以不会重新编译。直接在makefile中添加 func.h 依赖,这样一来,通过上面模式规则所生成的真正规则当中,每一个.o 文件都会依赖到 .h 头文件。因此,规则中以源文件为依赖,命令可能无法执行。当头文件改动后,自动确认需要重新编译的文件。将生成的依赖自动包含进makefile中。原创 2024-01-25 00:27:13 · 607 阅读 · 0 评论 -
Makefile编译原理 函数的定义及调用
make解释器提供了一系列的函数供makefile调用在makefile中支持自定义函数实现,并调用执行通过define关键字实现自定义函数实验:深入理解自定义函数:自定义函数是一个多行变量,无法直接调用自定义函数是一种过程调用,没有任何的返回值自定义函数用于定义命令集合,并应用于规则中自定义函数调用深度理解:说明:实验结果打印了函数被调用了吗? 函数肯定没有被调用,这仅仅是 func1这个多行变量的值。define 是用来定义多行变量的,只不过说 多行变量可以在call 的作用下当作一个原创 2024-01-23 23:39:54 · 670 阅读 · 0 评论 -
Makefile编译原理 条件判断语句
条件判断语句之前可以有空格,但不能没有Tab字符('\t')一条件完整的条件语句必须位于同一makefie中。可以根据条件的值来决定make的执行。可以比较两个不同变量或者变量和常量值。原创 2024-01-21 14:54:28 · 732 阅读 · 0 评论 -
Makefile编译原理 特殊的变量
【代码】Makefile编译原理 特殊的变量。原创 2024-01-17 00:00:34 · 520 阅读 · 0 评论 -
Makefile编译原理 变量的使用
不能包含 ":" "#" "=" " "->makefile中的变量只代表文本数据(字符串)->makefile中支持程序设计语言中变量的概念。- 变量名可以包含字符,数字,下划线。->makefile中的变量名规则。- 变量名大小写敏感。原创 2024-01-14 23:48:11 · 489 阅读 · 0 评论 -
Makefile编译原理 make和makefile
如图所示,一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中, Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile 文件就像一个 Shell 脚本一样,也可以执行操作系统的命令。Makefile 带来的好处就是自动化编译,一旦写好,只需要一个 make 命令,整 个工程完全自动编译,极大的提高了软件开发的效率。原创 2024-01-13 23:40:37 · 594 阅读 · 0 评论 -
Linux驱动开发 (framebuffer驱动)
1.什么是framebufferframbuffer就是linux内核驱动申请的一片内存空间,cpu内部有个lcd控制器,它有个单独的dma用来将frambuffer中的数据拷贝到lcd的sram中去 拷贝到lcd的sram中的数据就会显示在lcd上,LCD驱动和framebuffer驱动没有必然的联系。framebuffer帧缓冲(简称fb)是linux内核中虚拟出的一个设备。framebuffer向应用层提供一个统一标准接口的显示设备。从驱动来看,fb是一个典型的字符设备,而且创建了一个原创 2021-08-09 23:19:46 · 3388 阅读 · 1 评论 -
Linux驱动开发 (IIC子系统)
1.IIC协议简介在之前的ARM裸机里面有介绍:https://blog.csdn.net/weixin_49303682/article/details/1193052272.Linux的IIC子系统框架I2C主机驱动:I2C主机控制器的驱动,一般由SoC芯片厂商负责设计实现,用于控制II2C主机控制器发出时序信号。I2C Core:为上层提供统一的API接口和对其他模块进行注册和注销等管理等。I2C 驱动和我们之前接触到的平台总线设备驱动非常类似,都有总线、设备和驱这三者。原创 2021-08-10 23:44:37 · 684 阅读 · 0 评论 -
Linux驱动开发 (platform平台总线驱动LED)
1.platform平台总线简介-> 相对于usb、pci、i2c等物理总线来说,platform总线是虚拟的、抽象出来的。-> CPU与外部通信的2种方式:地址总线式连接和专用接口式连接。平台总线对应地址总线式连接设备,也就是SoC内部集成的各种内部外设。-> platform工作体系都定义在drivers/base/platform.c中。->两个结构体:platform_device和platform_driver。2.platform_device结.原创 2021-08-09 21:27:00 · 660 阅读 · 0 评论 -
Linux驱动开发 (总线式设备驱动)
1.驱动框架中的总线式设计bus_type结构体:-> 关键是match函数和uevent函数。struct bus_type { const char *name; //总线类型名struct bus_attribute *bus_attrs; //总线属性和导出到sysfs中的方法struct device_attribute *dev_attrs; //设备属性和导出到sysfs中的方法struct driver_attribute *drv_attrs; .原创 2021-08-08 23:26:12 · 916 阅读 · 0 评论 -
Linux驱动开发 (设备驱动模型的底层架构)
1.设备驱动模型简介-> 设备驱动模型其实是Linux内核为了管理硬件上的设备和对应的驱动制定的一套软件体系。-> 类(class)、总线(bus)、设备(device)、驱动(driver)、mdev(自动创建设备节点和设备类)sysfs等都属于设备驱动模型的范畴。2.为什么需要设备驱动模型-> 2.6版本中正式引入设备驱动模型,目的是在设备越来越多,功耗要求等新特性要求的情况下让驱动体系更易用、更优秀。->设备驱动模型负责统一实现和维护一些特性.-&.原创 2021-08-08 22:16:03 · 655 阅读 · 0 评论 -
Linux驱动开发(内核的gpiolib驱动LED)
1.gpiolib的建立过程(1)函数在arch/arm/mach-s5pv210/gpiolib.c ----> s5pv210_gpiolib_init(初始化函数)。2.struct s3c_gpio_chip(结构体)(1)这个结构体是一个GPIO端口的抽象,这个结构体的一个变量就可以完全的描述一个IO端口。(2)S5PV210有很多个IO口(160个左右),这些IO口首先被分成N个端口(port group),然后每个端口中又包含了M个IO口。譬如GPA0是一个端口,原创 2021-07-07 23:53:47 · 552 阅读 · 0 评论 -
linux驱动开发 ST库 裸机 设备树 点灯的区别
stm32使用st库的方式配置,全部都被st库封装好了,开发者没有直接配置寄存器,底层实现也是通过配置寄存器实现的,只不过被st库封装好了,现实开发中还要配置GPIO,以及一些简单的逻辑即可,st库为我们提供了接口,即使在不知道底层框架的实现原理,也能很好的进行开发。以上的函数配置我们都没有直接对我们说的GPIO的寄存器进行操作,这是因为ST标准库已经对寄存器进行了封装,我们调用的函数其实最底层完成的工作就是的对寄存器进行读写操作,接下来我们看一下我们在初始化引脚的时候对究竟对什么寄存器进行了什么操作。..原创 2022-08-11 00:57:42 · 106 阅读 · 1 评论 -
linux驱动开发 新型LINUX驱动开发 DTS设备树
如:/WorkPlatform/T5/auto-T507-linux4.9-v1.0/t5_alter/CLIENT/tshumh_TSH/sysfile/board.dts。path:带有全路径的节点名,可以使用节点的别名,比如“/backlight”就是 backlight 这个节点的全路径。status 属性是描述设备的状态的,“okay” 表明设备是可操作的,disabled”表明设备当前是不可操作。(2)在/节点外,有些像&cpu_trip这样的语句,是对某个节点的追加。原创 2022-11-08 23:33:30 · 1943 阅读 · 0 评论 -
Linux驱动开发(驱动中如何操控硬件LED)
1、还是那个硬件(1)硬件物理原理不变(2)硬件操作接口(寄存器)不变(3)硬件操作代码不变2、哪里不同了?(1)寄存器地址不同。原来是直接用物理地址,现在需要用该物理地址在内核虚拟地址空间相对应的虚拟地址。寄存器的物理地址是CPU设计时决定的,从datasheet中查找到的。(2)编程方法不同。裸机中习惯直接用指针操作寄存器地址,而kernel中习惯用封装好的io读写函数来操作寄存器,以实现最大程度可移植性。3.地址映射在编写驱动之前,我们需要先简单了解一下 MMU 这个神器, MM原创 2021-07-07 22:36:53 · 444 阅读 · 0 评论 -
Linux驱动开发(应用程序如何调用驱动)
1.添加读写接口(1)在应用代码中:(2)在驱动代码中:2.应用和驱动之间的数据交换(1)copy_from_user,用来将数据从用户空间复制到内核空间(2)copy_to_user,用来将数据从内核空间复制到用户空间(3)write和read函数实现:读函数:写函数:3.应用程序如何调用驱动源码:应用层:#include <stdio.h>#include <sys/types.h>#include ..原创 2021-07-07 00:49:01 · 4774 阅读 · 0 评论 -
linux驱动开发 编译内核模块生成ko驱动文件
1.加载内核简介Linux内核的整体架构本就非常庞大,其包含的组件也非常多。而我们怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译到Linux内核中。这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。Linux提供了这样的机制,这种机制被称为模块(Module)。可使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中。模块本身不被编译入内核映像,从而控制了内核的大小。·模块一旦被加原创 2022-11-02 23:00:37 · 4513 阅读 · 0 评论 -
Linux驱动开发(从零开始编写一个驱动程序)
1、系统整体工作原理(1)应用层->API->设备驱动->硬件(2)API:open、read、write、close等(3)驱动源码中提供真正的open、read、write、close等函数实体2、file_operations结构体(用来挂接实体函数地址)(1)元素主要是函数指针,用来挂接实体函数地址(2)每个设备驱动都需要一个该结构体类型的变量(3)设备驱动向内核注册时提供该结构体类型的变量3、注册字符设备驱动驱动向内核注册函数register原创 2021-07-06 23:57:09 · 15811 阅读 · 0 评论 -
Linux驱动开发(最简单的驱动模块,内核printk函数)
1.最简单的驱动模块源码:#include <linux/module.h> // module_init module_exit#include <linux/init.h> // __init __exit// 模块安装函数static int __init chrdev_init(void){ printk(KERN_INFO "chrdev_init helloworld init\n"); return 0;}// 模块卸载函数st原创 2021-07-06 23:01:41 · 886 阅读 · 0 评论 -
Linux驱动开发 应用程序是如何调用驱动程序的
1.简介学习 Ubuntu 操作系统、学习 ARM 裸机、学习系统移植,其目的就是为了学习驱动做准备。Linux 中的三大类驱动:字符设备驱动、块设备驱动和网络、设备驱动。其中字符设备驱动是占用篇幅最大的一类驱动,因为字符设备最多,从最简单的点灯到 I2C、 SPI、音频等都属于字符设备驱动的类型。块设备和网络设备驱动要比字符设备驱动复杂,就是因为其复杂所以半导体厂商一般都给我们编写好了,大多数情况下都是直接可以使用的。所谓的块设备驱动就是存储器设备的驱动,比如 EMMC、 NAND、 S原创 2021-07-06 22:35:30 · 464 阅读 · 0 评论 -
Linux驱动开发 根文件系统的制作
1.busybox的移植实战(1)下载busybox可以去busybox官方网站下载。(2)修改MakefileARCH = armCROSS_COMPILE = (安装交叉编译工具链的路径)/arm-none-linux-gnueabi-(3)make menuconfig进行配置Busybox Settings---> Build Options---> [*]Build BusyBox as a static binary(no shared libs).原创 2021-06-27 23:21:04 · 169 阅读 · 0 评论 -
Linux驱动开发 根文件系统的原理
1.概述为什么需要根文件系统:(1)init进程的应用程序在根文件系统上(2)根文件系统提供了根目录/(3)内核启动后的**应用层配置(etc目录)**在根文件系统上。几乎可以认为:发行版=内核+rootfs(4)shell命令程序在根文件系统上。譬如ls、cd等命令.根文件系统的实质是什么:(1)根文件系统是特殊用途的文件系统,文件系统是一些代码,是一套软件,这套软件的功能就是对 存储设备的扇区进行管理,将这些扇区的访问变成了对目录和文件名的访问.(2)不同的文件系统的...原创 2021-06-27 18:51:54 · 326 阅读 · 0 评论 -
linux驱动开发 移植三星的kernel(三)
1.iNand的问题原创 2021-10-05 19:43:18 · 558 阅读 · 1 评论 -
linux驱动开发 移植三星的kernel(二)
1.内核中机器码的确定机器码一般在mach里面,找到自己对应的开发板。MACHINE_START宏:这个宏用来定义一个机器码的数据结构的。这个宏的使用其实是用来定义一个结构体类型为machine_desc类型的结构体变量,名为__mach_desc_SMDKV210。这个结构体变量会被定义到一个特定段.arch.info.init,因此这个结构体变量将来会被链接器链接到这个.arch.info.init段中。static const struct machine_desc _.原创 2021-09-28 02:32:45 · 304 阅读 · 0 评论 -
linux驱动开发 移植三星的kernel(一)
1.ubuntu下解压kernel2 .配置编译下载检查Makefile中ARCH和CROSS_COMPILEmake xx_defconfig(找到三星的210对应的编译文件)make menuconfigmake -j4默认情况下直接make则会直接单线程编译。但是如果make -j4则会4线程编译。编译完成:得到zImage烧录后启动不起来。。。。。。。正常的启动结果:kernel启动后打印出来的第一句话:Uncompressi...原创 2021-09-27 23:03:36 · 342 阅读 · 0 评论 -
Linux驱动开发 menuconfig配置内核
menuconfig是linux里面的一个软件,可以配置uboot,kernel,rootf,这里以kernel为例来配置,其他的配置menuconfig的使用是一样的。1.linux内核源码目录结构内核有三种:第一种是kernel.org上的(官方版本的),第二种是三星移植过的(厂商的),第三种是九鼎X210的移植版本(做产品的)。arch:意思是架构,arch目录下是好多个不同架构的CPU的子目录,譬如arm这种cpu的所有文件都在arch/arm目录下,X86的CPU的所有文件都在原创 2021-06-28 22:43:59 · 6228 阅读 · 2 评论 -
Linux驱动开发 内核的启动过程
1.head.S文件分析(1)内核运行的物理地址与虚拟地址KERNEL_RAM_VADDR(VADDR就是virtual address),这个宏定义了内核运行时的虚拟地址。值为0xC0008000KERNEL_RAM_PADDR(PADDR就是physical address),这个宏定义内核运行时的物理地址。值为0x30008000总结:内核运行的物理地址是0x30008000,对应的虚拟地址是0xC0008000。(2)内核的真正入口内核的真正入口就是ENTRY(stext)处原创 2021-06-27 17:03:24 · 1261 阅读 · 0 评论 -
Linux驱动开发 uboot如何启动内核
1.uboot和内核到底是什么:(1)uboot和内核本质是一个裸机程序,只是比我们平常看到的裸机像STM32之类的裸机大了很多,uboot和内核的裸机程序有很多个文件夹。(2)部署在SD卡中特定分区内,静止时(未上电时)bootloader、kernel、rootfs等必须的软件都以镜像的形式存储在启动介质中(X210中是iNand/SD卡);运行时都是在DDR内存中运行的。(3)运行时必须先加载到DDR中链接地址处,uboot(X210加载到DDR的0xc3e00000地址处),内核(X原创 2021-06-27 14:58:11 · 2351 阅读 · 0 评论 -
linux驱动开发 移植三星的uboot(三)
1.网卡芯片与开发板的连接方式网卡芯片要通过SROM Controller来连接,网卡接在SROM中,好处就是网卡芯片好像一个存储芯片一样被扩展在SoC的一个地址空间中,主机SoC可以直接用一个地址来访问网卡芯片内部寄存器。总结:实际上也是一种总线式连接方式。优势是SoC内部不需要内置网卡控制器,所有的SFR全都在外部网卡芯片中,而且还可以通过地址直接访问(IO与内存统一编址),不用像Nand/SD接口一样使用时序来访问。2.原理图浏览网线有8根线,但是实际只有.原创 2021-09-27 16:51:08 · 1931 阅读 · 0 评论 -
linux驱动开发 移植三星的uboot(二)
1.修改配置信息配置信息一般在smdkv210single.h里面具体是哪个smdkv210single.h要根据开发板的型号选择具体的smdkv210single.h修改名字:更改CONFIG_IDENT_STRING为" for ASTON210"2.DDR配置信息的更改从运行信息看到的结果,显示DRAM bank0和1的size值都设置错了bdinfo命令看到的结果:发现20000000和40000000开头的内存都是可以用的,说明代码中DDR初始化部分是正..原创 2021-09-27 00:48:30 · 390 阅读 · 0 评论 -
linux驱动开发 移植三星的uboot(一)
1.移植初体验从win拷贝三星的uboot到ubuntu中解压检查Makefile中的交叉编译工具链配置时使用:make smdkv210single_config,对应include/configs/smdkv210single.h头文件编译完成:配置完成后直接make编译,编译完成后就进入烧录步骤。uboot/sd_fusing目录下有sd_fusing.sh脚本,用来烧录。检查:uboot 1到49扇区先清理一下,再执行下烧录:2.代码分..原创 2021-09-26 20:36:34 · 285 阅读 · 1 评论 -
Linux驱动开发 uboot启动第二阶段
网卡初始化、机器码(gd->bd->bi_arch_number)、内核传参DDR地址(gd->bd->bi_boot_params)、Timer4初始化为10ms一次、波特率设置(gd->bd->bi_baudrate和gd->baudrate)、console第一阶段初始化(gd->have_console设置为1)、打印uboot的启动信息、打印cpu相关设置信息、检查并打印当前开发板名字、DDR配置信息初始化(gd->bd->bi_dram)、打印DDR总容量。所以uboot中定时时不能做其他事。原创 2021-06-27 00:30:11 · 1111 阅读 · 0 评论