uboot-fuhan
flash采用emmc
mmc 开启mmc硬件连接的SD1接口;include/configs/fh8856V500.h 中开启SD1即可。
查看.config 配置和 u-boot.cfg 配置,关于mmc的配置开启。
uboot环境变量保存位置修改borad.c,返回设备序号即可。
环境变量保存地址12345#define EMMC_ENV_OFFSET 0x20000#define CONFIG_CMD_MMC#define CONFIG_ENV_IS_IN_MMC#define CONFIG_SYS_MMC_ENV_DEV 0#define CONFIG_SYS_MMC_ENV_PART 1
开发过程脚本命令fuhan
uboot emmc版本ip地址1setenv ipaddr '192.168.8.210';setenv serverip '192.168.8.217';
下载烧写uboot1mmc dev 0 1;tftp a1000000 Flash.img;mmc erase 0 2000; mmc write a1000000 0 2000
下载烧写内核1mmc dev 0 ; tftp a1000000 uImage_FH8856V500; mmc write a1000000 0 5500;reset
启动内核1mmc dev 0; mmc read 0xA1000000 0 5500; bootm 0xA1000000
分区0-2M bootloader
2M-26M kernel
6001-M rootfs
linux 源码分析-arm
arm架构:
linux 启动流程linux启动先从head.s 开始,源码路径为:arch/arm/boot/head.s1、head.s 启动函数完成引导参数初始化,跳转start_kernel函数2、start_kernel函数源码路径为:init/main.c完成系统初始化,执行rest_init,调用kernel_init函数
Kconfig配置1234567891011121314151617181920212223242526272829303132333435# SPDX-License-Identifier: GPL-2.0-only## RF switch subsystem configuration#menuconfig RFKILL tristate "RF switch subsystem support" help Say Y here if you want to have control over RF switches found on many WiFi and Bluetooth ...
并发与竞争
1、应用层的锁和内核中的锁区别1-1、特性1-1-1、 内核锁(Kernel Locks)
作用:内核锁用于保护内核数据结构,防止多个内核线程或进程同时访问和修改这些数据结构,从而避免数据不一致或竞争条件。
类型:
自旋锁(Spinlock):当一个线程试图获取已经被占用的自旋锁时,它会不断循环(自旋)直到锁可用。适用于持有时间短的场景。
互斥锁(Mutex):当一个线程试图获取已经被占用的互斥锁时,它会被阻塞,直到锁可用。适用于持有时间较长的场景。
读写锁(Read-Write Lock):允许多个读操作同时进行,但写操作是独占的。适用于读多写少的场景。
使用场景:内核锁主要用于内核空间,保护内核数据结构,确保内核的稳定性和一致性。
1-1-2、 应用层锁(Application-Level Locks)
作用:应用层锁用于保护应用程序中的共享数据,防止多个线程或进程同时访问和修改这些数据,从而避免数据不一致或竞争条件。
类型:
互斥锁(Mutex):类似于内核中的互斥锁,用于保护共享资源,确保同一时间只有一个线程可以访问。
读写锁(Read-Write Lock):允许多个读 ...
无题
1、设备树学习的关键问题1-1、设备树是什么(1)device tree,设备树,是一种linux内核中采用的参数表示和传递的一种技术。(2)dts,device tree source ,设备树源文件 一般的给改设备树就在这里进行。(3)dtc,device tree compiler,设备树编译/调试工具。(4)dtb,device tree blob,二进制设备树镜像。
1-2、为什么需要设备树(1)典型需求就是内核设备驱动,但不止可以用在驱动上,也可以用在uboot向内核的传参。(2)驱动源码包括2大部分:策略(操作函数)和数据(硬件信息)。(3)早期在策略和数据都在kernel中。
1-3、设备树如何工作的(1)驱动开发者编写或者改写dts ,适配硬件和自己的需求。(2)make uImage时,kernel会先编译出dtc,然后用dtc加工成dtb。(3)uboot启动kernel时,将uImage和dtb都准备好并告诉uImage在哪里找到dtb。(4)kernel启动初期会调用内部的函数去解析dtb,得到硬件信息,并组装成数据结构,配合策略函数工作。 ...
常见的总线和通讯方式
I2C 总线I2C(Inter-Integrated Circuit,集成电路间通讯)是一种用于在多个集成电路之间进行数据交换的协议,它使用 two-wire(两线)通信协议,通常由两个 GPIO(通用输入输出)引脚组成,通常为 SDA(数据线)和 SCL(时钟线)。I2C 总线具有以下特点:
半双工通信:在同一时间内,数据线(SDA)只能由一个设备控制。以下是一次典型的 I2C 数据传输流程(包含 8 位数据帧):
起始条件:主设备发起起始信号,表示数据传输开始。
从机地址:主设备发送 7 位的从机地址和 1 位的读写位(0 表示写,1 表示读)。
应答信号:从设备接收到地址后,会发送一个应答位(ACK)表示已正确接收。
数据传输:主设备或从设备开始传输 8 位的数据。
应答信号:每传输完 8 位数据,接收方会发送一个应答位。
停止条件:主设备发起停止信号,表示数据传输结束。
如果通讯过程中如果从机反应比较慢,这时候从机是可以把时钟线拉低来让主机等待的,很多拿GPIO模拟的I2C都没实现。还有就是I2C总线是允许多主机的,多主机如何避免冲突等等。实际使用中,像STM32出现I2C ...
蓝牙
角色认识master 和slave属于建立连接之后的概念,一旦建立连接,scanner角色变为master,advertiser变为slave。 根据应用场景的需求,一个设备可以是master,也可以是slave或者二者兼备。 初始化建立连接的设备称为master,负责广播的并接收连接请求的设备称为slave。
无题
设备树中,半导体厂商一般已经将芯片的型号、频率、IO、中断、时钟、DMA、内存等参数进行了封装,用户只需要在设备树中引用即可。举例:配置gpio,gpio一般在设备树中以节点方式描述,节点名以gpio开头,节点名后面接gpio的编号,如gpio0、gpio1、gpio2等。如imx6ull的gpio1节点:
123456789101112gpio1: gpio@0209c000 { compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio"; reg = <0x0209c000 0x4000>; interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>; gpio-controller; #gpio-cells = <2>; interrupt-controller; #interrupt-cells cc ...
交叉编译器
交叉编译器详解交叉编译工具链的命名规则反映了目标架构、操作系统、ABI特性及工具链提供商等关键信息。理解命名规则有助于快速识别工具链的适用场景和特性。以下是常见规则及示例:
一、标准GNU工具链命名格式1<架构>-<厂商>-<系统>-<ABI>-<工具>
核心字段含义:
架构(Architecture)目标芯片的架构类型,常见值:
arm/aarch64:ARM 32/64位架构
x86_64/i686:x86 64/32位架构
riscv64/riscv32:RISC-V 64/32位架构
mips/powerpc:MIPS/PowerPC架构
厂商(Vendor)工具链提供商或定制者,常见值:
none:通用裸机(无操作系统)工具链
linux:针对Linux系统的工具链
unknown:未知/通用厂商
特定厂商名(如 uclibc、musl)
系统(System)目标操作系统或环境:
linux:适用于Linux系统 ...











