自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ARM buildroot 的引入

(1) tslib_x210_qtopia.tgz 是用来支持 QT 的触摸屏操作的应用层库。(2) xboot 和 uboot 是 X210 支持的 2 个 bootloader 源代码。kernel 文件夹中是内核源代码,buildroot 文件夹是用来构建根文件系统的文件夹。tools 里是一些有用工具。(3) mk 脚本是用来管理和编译整个 bsp 的。(1)之前自己从零开始构建根文件系统,一路下来事情还挺多,步骤比较麻烦。

2023-04-24 23:21:20 1298 2

原创 ARM busybox 的移植实战2

文件,是 linux 的运行时配置文件中最重要的一个,其他的一些配置都是由这个文件引出来的。这个文件可以很复杂,也可以很简单,里面可以有很多的配置项。?(1) mdev 是 udev 的嵌入式简化版本,udev/mdev 是用来配合 linux 驱动工作的一个应用层的软件,udev/mdev 的工作就是配合 linux 驱动生成相应的 /dev 目录下的设备文件。(2) 因为这个问题涉及到驱动,因此详细讲解要等到驱动部分。这里我们只是通过一些直观的现象来初步理解 udev/mdev 的工作效果。

2023-04-23 22:37:47 1271

原创 git 查看 stash 记录的内容

【代码】git 查看 stash 记录的内容。

2023-04-21 08:50:32 1025

原创 ARM busybox 的移植实战1

先逐步构建 “文件夹形式”的根文件系统,然后制作烧录镜像。(1)(2) 我们先从空文件夹开始,逐步向其中添加一些 rootfs 中必备的东西,然后做一步就用 nfs 方式去挂载启动,观察启动后的现象,并且理论上去分析原因。

2023-04-20 22:37:07 1448

原创 ARM rootfs、linuxrc 的简单制作

(1) nfs 方式启动,相当于开发板上的内核远程挂载到主机上的rootfs。(2) nfs 方式启动,不用制作 rootfs 镜像。(3) nfs 方式不适合真正的产品,一般作为产品开发阶段调试使用。(1)/linuxrc 是应用层的程序,和内核源码一点关系都没有。(2) /linuxrc 在开发板当前内核系统下是可执行的。因此在 ARM SoC 的 linux 系统下,这个应用程序就是用 arm-linux-gcc 编译链接的;

2023-04-18 13:40:27 877

原创 ARM 制作简易的根文件系统

(1)镜像文件形式的根文件系统,主要目的是用来烧录到块设备上,设备上的内核启动后,去挂载它。镜像文件形式的根文件系统,是由文件夹形式的根文件系统,使用专用的镜像制作工具制作而成的。(2) 最初在开发主机中随便 mkdir 创建了一个空文件夹,然后向其中添加一些必要的文件(包括 etc 目录下的运行时配置文件、/bin 等目录下的可执行程序、/lib 目录下的库文件等···)后就形成了一个文件夹形式的 rootfs。然后。

2023-04-15 00:01:59 934

原创 ARM kernel 内核的移植 - 从三星官方内核开始移植

(1) 分析:问题究竟是怎么被解决的?涉及哪几个方面。根本原因在于 CONFIG_MFD_MAX8698 这个配置宏。这个配置宏决定了很多东西。第一:这个配置宏 决定了 drivers 目录下的 max8698 对应的驱动程序源代码是否被编译。第二:这个配置宏 决定了 kernel 启动过程中是否会调用一些 max8698 的相关的代码。(2) 总结:kernel 是高度模块化和可配置化的,所以在内核中做任何事情(添加一个模块、更改一个模块、去掉一个模块)都必须按照内核设定的方案和流程来走。

2023-04-13 22:53:08 1318

原创 ARM Linux 内核启动2 ——C语言阶段

(1) 从名字看,这个函数是 CPU 架构相关的一些创建过程。(2) 实际上这个函数是用来确定我们当前内核的机器(arch、machine)的。我们的 linux 内核会支持一种 CPU 的运行,“CPU+开发板” 就确定了一个硬件平台,然后我们当前配置的内核 就在这个平台上可以运行。之前说过的机器码,就是给这个硬件平台一个固定的编码,以表征这个平台。(3) 当前内核支持的机器码以及硬件平台相关的一些定义都在这个函数中处理。(1) 进程和线程。简单来理解,一个运行的程序就是一个进程。

2023-04-09 22:37:12 1059

原创 ARM Linux 内核启动1 —— 汇编阶段

(1) kernel 的 Makefile 写法和规则等,和 uboot 的 Makefile 是一样的,甚至 Makefile 中的很多内容都是一样的。(2) kernel 的 Makefile 比 uboot 的 Makefile 要复杂,这里我们并不会一行一行的详细分析。(3) Makefile 中只有一些值得关注的会强调一下,其他不强调的地方暂时可以不管。(4) Makefile 中刚开始,定义了 kernel 的内核版本号。这个版本号挺重要(在模块化驱动安装时会需要用到),要注意会查,会改。

2023-04-08 17:40:58 1176

原创 ARM uboot 启动 Linux 内核

进入 uboot 的 sd_fusing 目录,执行命令烧写 uboot :./sd_fusing.sh /dev/sdb。将 Linux kernel 拷贝到 30008000。

2023-04-06 19:07:14 1077

原创 ARM Linux 内核的配置和编译原理

(3) 当我们每次退出 make menuconfig 时,menuconfig 机制会首先检查我们有没有更改某些配置项的值,如果我们本次没有更改过任意一个配置项目的值,那直接退出;如果我们有改动配置项的值,则会提示我们是否保存。

2023-04-05 23:16:29 1579

原创 ARM 话说 Linux 内核

(1) 因为 linux 内核很庞大,代码量很大、东西很多,如果设计时完全设计成一体(各个文件、各个函数之间紧耦合),复杂度超出了人所能理解的范围。所以模块化设计也是一种必要。(2) 模块化设计就是,内核中各个功能模块在代码上是彼此独立的;譬如说,调度系统和内存管理系统之间,并没有全局变量的互相引用,甚至函数互相调用也很少,就算有 也是遵循一个接口规范的。模块化设计的目的,就是实现功能模块的松耦合。

2023-04-05 23:13:59 711

原创 ARM uboot 的移植6 -从 uboot 官方标准uboot 开始移植

(1) 2015.11 月初之前购买的 X210 开发板都属于老版本,型号是;之后购买的开发板都是新版本的,型号是。(2) 两个开发板主要电路是完全一样的,不同主要有 3 点:一个是把拨码开关换成了短路帽;另一个是 LCD 分辨率从升级成;第三个是触摸屏芯片型号换了。

2023-04-05 23:09:42 486

原创 Linux 格式化磁盘,制作文件系统 => 报错: dev/sdb is NOT identified.

经过实践,发现格式化 SD 卡可以解决该问题;或者使用命令发现 sdb 块设备的文件类型不是 b(块设备),此时删除,然后重新插入 SD 卡,也能解决问题。

2023-04-05 22:22:09 1485

原创 ARM 自己实现一个 shell 解释器

添加 cmd_parser 和 cmd_exec。实现简单的 cmd_parser 和 对应的 cmd_exec。// 命令解析和命令执行相关的函数 # include "shell.h" # include "stdio.h" char g_cmdset [ CMD_NUM ] [ MAX_LINE_LENGTH ];// 初始化命令列表 void init_cmd_set(void) {// 先全部清零 strcpy(g_cmdset [ 0 ] , led);

2023-04-05 22:09:29 474

原创 ARM 触摸屏 TouchScreen

(1) 耐久性 电容式触摸屏不容易坏,电阻式触摸屏易坏(2) 抗干扰性 电容式触摸屏差一些,电阻式触摸屏要好一些(3) 精准度 电容式触摸屏差一些,电阻式触摸屏好一些(4) 用户体验 电容式触摸屏要好一些,电阻式触摸屏要差一些(5) 价格 电容式触摸屏贵一些,电阻式触摸屏便宜很多。

2023-04-01 15:38:22 964

原创 ARM LCD 编程实战

一、LCD编程实战1 - LCD 控制器初始化参考代码 lcd_init 函数详解(1) 要想 LCD 工作,必须给 LCD 屏幕和显存之间建立一个映射(映射是在 CPU 初始化 LCD 控制器来完成的)。本部分就是在完成这个过程(这也是 LCD 显示的 2 个阶段的第一阶段,第二阶段中我们只需要给显存中丢入相应的数据,LCD 屏幕就会自动显示相应内容)。1. 配置 GPIO 初始化,复用为 LCD 引脚。2. 打开 LCD 屏幕的背光.3. 显示路径的选择,FIMD 控制器使用

2023-03-30 00:40:15 846

原创 ARM uboot 的移植5 -从 uboot 官方标准uboot 开始移植

(1) 测试环境变量是否可以保存。通过开机 set 设置环境变量,然后 save,然后关机后重启来测试环境变量的保存是否成功。(2) 我们的环境变量究竟保存到哪里去了?这个就要去分析代码中的分区表。(3) 环境变量应该被放在哪里?虽然无法确定 ENV 一定要放在哪里,但是有一些地方肯定是不能放的,否则将来会出问题。原则是:同一个 SD 卡扇区只能放一种东西,不能叠加,否则就会被覆盖掉。

2023-03-19 01:39:26 715

原创 ARM LCD 简介

(1) LCD(Liquid Crystal Display) 俗称液晶。(2) 液晶是一种材料,液晶这种材料具有一种特点:可以在电信号的驱动下,液晶分子进行旋转,旋转时会影响透光性,因此我们可以在整个液晶面板后面用白光照(称为背光),可以通过不同的电信号,让液晶分子进行选择性的透光,此时在液晶面板前面看到的就是各种各样不同的颜色,这就是 LCD 显示。(3) 被动发光和主动发光。(4) 液晶应用领域:电视机、电脑显示屏、手机显示屏、工业显示屏等····

2023-03-18 14:42:07 1051

原创 ARM uboot 的移植4 -从 uboot 官方标准uboot 开始移植

移植成功。(1) 在 uboot2013.10 中和 uboot1.3.4 中的设计有所不同。在 uboot1.3.4 中,这个东西是分散定义在各个配置头文件当中的。但是在 uboot2013.10 中,我们把MACH_TYPE集中定义在一个文件arch/arm/include/asm/mach-types.h 中了。(2) 集中定义其实是 uboot 从 linux 内核中学来的。在 linux kernel 中,MACH_TYPE就是在文件中集中定义的。集中定义的好处是方便查阅,不容易定义重复。

2023-03-18 00:15:41 537

原创 git 错误:TLS certificate verification has been disabled!

在公司电脑上,上传个人的笔记时,git push命令一直失败。

2023-03-14 19:33:52 659

原创 ARM ADC转换编程实践

开启 start by read 模式,第一次先读一次丢掉,这次读就能开启下一次 AD 转换,然后以后就可以不停的读取 AD 值了。

2023-03-12 11:43:17 541

原创 ARM uboot 的移植4 -从 uboot 官方标准uboot开始移植

(1)DDR配置参数,从三星版本的中复制到s5p_goni.h中。1、(2)s5pc110.h中进行修整。

2023-03-11 14:26:11 2073

原创 ARM uboot 的移植3 -从 uboot 官方标准uboot开始移植

一、选择合适的官方原版 uboot1、官方原版 uboot 的版本(1) 版本号。刚开始是 1.3.4 样式,后来变成 2009.08 样式。(2) 新版和旧版的差别。uboot 的架构很早就定下来了,然后里面普遍公用的东西(common 目录下、drivers 目录下、fs 目录下等···)在各个版本之间几乎是完全一样的。差别最大的是 board 和 cpu 目录,这两个目录正是单板(开发板)相关的。越新的 uboot 版本支持越多的开发板(CPU),所以越新的 uboot 越庞大。(3) 并不

2023-03-08 00:19:15 2063 2

转载 ARM 学习 DM9000 网卡原理与基地址设置

一、网卡也是属于类内存总线的设备,类内存总线的设备有地址总线和数据总线,先来看下DM9000的管脚:从上面可以看出,DM9000 的地址总线就一根,它不像 CS8900 那样,地址总线和数据总线都齐全。而这里只有一根地址线(CMD),16 根数据线,所以可以确定位宽为 16 位,而地址线为什么只有一根,这是 DM9000 决定的。看手册可以知道,CPU 总线只访问它的两个地址:CMD 管脚为 0 时,数据线送的是 DM9000 的寄存器地址,CMD 管脚为 1 时,数据线上送的是 16 位的寄存器数

2023-03-05 16:22:46 884

原创 ARM uboot 的移植2-从三星官方 uboot 开始移植

一、inand 驱动问题的解决1、先从现象出发定位问题(1) 解决问题的第一步,是定位问题。所谓定位问题,就是找到源代码当中导致这个问题的那一句或者那几句代码。有时候解决这个问题需要修改的代码和直接导致这个问题的代码是不同的。我们这里说的定位问题指的是,定位到出问题的代码处,也就是运行了这一句代码时发生了这个错误。(2) 定位了问题之后,实际修改程序解决问题不一定改的是这一句代码。但是肯定和这一句代码有关联,我们要通过自己分析来找到这种关联,从而从定位的错误点找到真正需要修改的点,然后去修改他。(

2023-03-05 15:49:01 602

原创 ARM uboot 的移植0-从三星官方 uboot 开始移植的准备工作

一、移植前的准备工作1、三星移植过的uboot源代码准备(1) 三星对于 S5PV210 的官方开发板为 SMDKV210,对应的移植过的 uboot 是:三星官方为210移植过的uboot和kernel/android_uboot_smdkv210.tar.bz2。(2) 这个源代码网上是下载不到的,三星官方是不会把这些东西放在官网上下载的。这些东西都是随着官方的开发板一起流出的。2、代码阅读工具的准备(1) 移植的时候最重要的工作就是看代码、改代码,然后编译运行测试。(2) 编译代码必

2023-03-05 00:01:21 477

原创 ARM uboot 的移植1-从三星官方 uboot 开始移植

一、移植初体验1、直接编译三星移植版 uboot 尝试运行(1) 复制到 linux 的源生目录下,然后解压开。(2) 检查 Makefile 中的交叉编译工具链。(3) 配置时使用:make smdkv210single_config,对应 include/configs/smdkv210single.h 头文件。(4) 配置完成后直接 make 编译,编译完成后就进入烧录步骤。make distcleanmake smdkv210single_configmake -j8

2023-03-04 16:32:11 546

原创 ARM uboot 源码分析9 - uboot的硬件驱动部分

一、uboot 与 linux 驱动1、uboot 本身是裸机程序(1) 裸机本来是没有驱动的概念的(狭义的驱动的概念就是,操作系统中用来具体操控硬件的那部分代码叫驱动)(2) 裸机程序中是直接操控硬件的,操作系统中必须通过驱动来操控硬件。这两个有什么区别?本质区别就是分层。2、uboot 的虚拟地址对硬件操作的影响(1) 操作系统(指的是 linux)下 MMU 肯定是开启的,也就是说,linux 驱动中肯定都使用的是虚拟地址。而纯裸机程序中,根本不会开 MMU,全部使用的是物理地址。这是裸机

2023-03-04 01:09:27 813

原创 ARM uboot 源码分析8 - uboot的环境变量

一、uboot 的环境变量基础1、环境变量的作用(1) 让我们可以不用修改 uboot 的源代码,而是通过修改环境变量,来影响 uboot 运行时的一些数据和特性。譬如说,通过修改 bootdelay 环境变量,就可以更改系统开机自动启动时倒数的秒数。2、环境变量的优先级(1) uboot 代码当中有一个值,环境变量中也有一个值。uboot 程序实际运行时规则是:如果环境变量为空,则使用代码中的值;如果环境变量不为空,则优先使用环境变量对应的值。(2) 譬如 machid(机器码)。uboot

2023-02-25 13:37:42 720

原创 ARM uboot 源码分析7 - uboot的命令体系

一、uboot 命令体系基础1、使用 uboot 命令(1) uboot 启动后进入命令行环境下,在此输入命令按回车结束,uboot 会收取这个命令然后解析,然后执行。2、uboot 命令体系实现代码在哪里(1) uboot 命令体系的实现代码在 uboot/common/cmd_xxx.c 中。有若干个 .c 文件和命令体系有关。(还有 command.c main.c 也是和命令有关的)3、每个命令对应一个函数(1) 每一个 uboot 的命令背后都对应一个函数。这就是 uboot

2023-02-24 19:42:10 751

原创 ARM uboot 源码分析6 - uboot如何启动内核

一、uboot 和内核到底是什么1、uboot 是一个裸机程序(1) uboot 的本质就是一个复杂点的裸机程序。和我们在 ARM 裸机全集中学习的每一个裸机程序并没有本质区别。(2) ARM 裸机第十六部分写了个简单的 shell,这东西其实就是个mini 型的 uboot。2、内核本身也是一个"裸机程序"(1) 操作系统内核本身就是一个裸机程序,和 uboot、和其他裸机程序并没有本质区别。 正是内核运行起来了之后,才有了称为操作系统的环境,操作系统负责管理所有计算机资源。(2) 区别就

2023-02-24 00:13:58 1916

原创 GNU make 中文手册 第三章:Makefile 总述

一、Makefile 总述3.1 Makefile 的内容在一个完整的 Makefile 中,包含了 5 个东西:显式规则、隐含规则、变量定义、指示符和注释。关于“规则”、“变量” 和 “Makefile 指示符” 将在后续的章节进行详细的讨论。本章讨论的是一些基本概念。显式规则:它描述了在何种情况下,如何更新一个或者多个被称为目标的文件(Makefile 的目标文件)。书写 Makefile 时,需要明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令(有些规则没有命令,这样的规则

2023-02-21 18:00:03 2406

转载 Vim 将 tab 自动转换成空格

在 Vim 中,有时需要将 tab 转换成 space。使用 ret 命令(replace tab)。[range]ret[ab]! [new-tabstop]举例:将第一行到文件尾的 tab 转换成 space,每个 tab 用 4 个 space 替代。:set expandtab:%ret! 4如果没有给定 4,则用当前的 tab 宽度设定替换为 space。其它相关命令::set tabstop=4 设定tab宽度为4个字符:set shiftwidth=4 设定自动缩进为4个字

2023-02-20 15:44:36 1065

转载 USB芯片到底完成了哪些工作?

上图,高速模块一般分为控制器 Controlle r和 PHY 两部分,Controller 大多为数字逻辑实现,PHY 通常为模拟逻辑实现。USB芯片也分为 Controller 部分和 PHY 部分。Controller 部分主要实现 USB 的协议和控制。内部逻辑主要有 MAC 层、CSR 层和 FIFO 控制层,还有其他低功耗管理之类层次。MAC 实现按 USB 协议进行数据包打包和解包,并把数据按照 UTMI 总线格式发送给 PHY(USB3.0 为 PIPE)。CSR 层进行寄存器控制,软件

2023-02-20 14:53:48 510

原创 GNU make 中文手册 第一二章 概述与介绍

一、第一章:概述准备知识在开始我们关于 make 的讨论之前,首先需要明确一些基本概念:编译:把高级语言书写的代码,转换为机器可识别的机器指令。编译高级语言后生成的指令虽然可被机器识别,但是还不能被执行。编译时,编译器检查高级语言的语法、函数与变量的声明是否正确。只有所有的语法正确、相关变量定义正确,编译器就可以编译出中间目标文件。通常,一个高级语言的源文件都可对应一个目标文件。目标文件在 Linux 中默认后缀为 “.o”(如 “foo.c” 的目标文件为 “foo.o” )。为了和规则的目标文件相

2023-02-20 14:06:42 775

原创 Git “git push“ 提示 user.name/user.email 不正确

一、问题现象使用 git push 命令提交代码,提示用户/邮箱不正确。现象如下:➤➤➤ git push Counting objects: 47, done.......remote: Processing changes: refs: 1, doneremote: ERROR: commit a8c8cc6: email address xxxx is not registered in your account, and you lack 'forge committer' permis

2023-02-20 10:39:25 1814

原创 ARM uboot 源码分析5 -启动第二阶段

一、start_armboot 解析61、console_init_f(1) console_init_f 是 console(控制台)的第一阶段初始化。_f 表示是第一阶段初始化,_r 表示第二阶段初始化。有时候初始化函数不能一次一起完成,中间必须要夹杂一些代码,因此将完整的一个模块的初始化分成了 2 个阶段。(我们的 uboot 中 start_armboot 的 826 行进行了 console_init_r 的初始化)(2) console_init_f 在 uboot/common

2023-02-17 22:07:50 1044

原创 ARM uboot 源码分析4 -启动第二阶段

一、start_armboot 函数简介1、一个很长的函数(1) 这个函数在 uboot/lib_arm/board.c 的第 444 行开始到 908 行结束。(2) 450 行还不是全部,因为里面还调用了别的函数。(3)为什么这么长的函数,怎么不分成两三个函数?主要因为这个函数整个构成了 uboot 启动的第二阶段。2、一个函数组成 uboot 第二阶段3、宏观分析:uboot 第二阶段应该做什么(1) 概括来讲,uboot 第一阶段主要就是初始化了 SoC 内部的一些部件(譬如看门

2023-02-13 23:31:08 587

转载 ARM MMU 详解

一、MMU 的产生许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以 K 为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起,还有用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块 0 首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由 OS 完

2023-02-12 18:46:00 773

uboot start.S ENTRY(save-boot-params) 分析过程

uboot start.S ENTRY(save_boot_params) 分析过程

2022-11-13

devmem工具 —— 用于 Linux 开发进行寄存器调试的工具

devmem工具 —— 用于 Linux 开发进行寄存器调试的工具

2022-05-30

空空如也

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

TA关注的人

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