Embedded Programming with the GNU Toolchain
Origin online url: https://www.bravegnu.org/gnu-eprog/ github repo: https://github.com/bravegnu/gnu-eprog/blob/master/gnu-eprog.asciidoc 1. IntroductionGNU工具链越来越多地被用于深度嵌入式软件开发。这种类型的软件开发也被称为独立C编程和裸机C编程。独立C编程带来了新的问题,处理这些问题需要对GNU工具链有更深入的理解。GNU工具链的手册提供了关于工具链的极好信息,但从工具链的角度,而不是问题的角度。好吧,无论如何,手册应该是这样写的。结果是常见问题的答案分散在各处,GNU工具链的新用户感到困惑。 本教程试图通过从问题的角度解释工具来弥合差距。希望这能让更多人能够使用 GNU 工具链进行嵌入式项目开发。 在本教程中,使用Qemu模拟基于ARM的嵌入式系统。有了这个,您可以在舒适的桌面上学习GNU工具链,而无需投资硬件。本教程本身不教授ARM指令集。它应该与其他书籍和在线教程一起使用,例如: ARM Assembler -...
Cvitek-v4.2.0 编译流程
编译流程说明1234567891011121314151617181920212223242526272829303132333435363738394041424344# 1. source build/envsetup_soc.sh(设置环境变量)yogurt@s:v4.2.x$ source build/envsetup_soc.sh ------------------------------------------------------------------------------------------------------- Usage: (1) menuconfig - Use menu to configure your board. ex: $ menuconfig (2) defconfig $CHIP_ARCH - List EVB boards($BOARD) by CHIP_ARCH. ** cv181x ** -> ['cv181x',...
Cvitek SDK 编译环境
SDK 下载利用 sophpi 中的脚本下载 SDK 到当前目录。 1git clone -b sg200x-evb git@github.com:sophgo/sophpi.git sophpi 中的脚本是将需要的仓库拉取到当前目录,为了区分,专门新建 v4.1.x 目录: 123mkdir v4.1.x && cd v4.1.x../sophpi/scripts/repo_clone.sh --gitclone ../sophpi/scripts/subtree.xml 如需使用双系统快启分支,则: 123mkdir v4.2.x && cd v4.2.x../sophpi/scripts/repo_clone.sh --gitclone ../sophpi/scripts/subtree_cv18xx-v4.2.x.xml 🙃可能遇到的问题: 没有权限拉取仓库。sophpi 的脚本中是用的 git clone ssh@xxx 走的 ssh,需要配置好 ssh key,否则会报错。可以替换 xml 中的...
Linux sysfs
chatgpt translate from https://www.kernel.org/doc/Documentation/filesystems/sysfs.txt sysfs - 内核对象导出的文件系统Patrick Mochel mochel@osdl.org Mike Murphy mamurph@cs.clemson.edu 什么是 sysfs:sysfs 是一个基于内存的文件系统,最初基于 ramfs。它提供了一种将内核数据结构、其属性及其之间的链接导出到用户空间的方法。 sysfs 本质上与 kobject 基础结构紧密相关。请阅读 Documentation/core-api/kobject.rst...
Linux USB functionfs
translate from https://www.kernel.org/doc/html/v6.1/usb/functionfs.html FunctionFS 如何工作从内核的角度来看,它只是一个具有一些独特行为的复合功能。只有在用户空间驱动程序通过写入描述符和字符串注册后,它才能被添加到 USB 配置中(用户空间程序必须提供与内核级复合功能在添加到配置中时提供的相同信息)。 123456From kernel point of view it is just a composite function with someunique behaviour. It may be added to an USB configuration only afterthe user space driver has registered by writing descriptors andstrings (the user space program has to provide the same informationthat kernel level composite...
Linux USB gadget_configfs
Linux USB gadget 通过 configfs 配置 先阅读 Linux configfs,再看此内容 usb 只有在作为从设备时,才会用到 configfs 去配置功能。 更新日期:2013年4月25日 概述USB Linux Gadget 是一种设备,它具有一个 UDC(USB 设备控制器),并且可以连接到 USB 主机,通过添加功能扩展主机,如串行端口或大容量存储功能。 123A USB Linux Gadget is a device which has a UDC (USB Device Controller)and can be connected to a USB Host to extend it with additional functionslike a serial port or a mass storage capability. 从主机的角度来看,一个 Gadget 是一组配置的集合,每个配置包含若干接口,而从 Gadget 的角度看,这些接口被称为功能(function),每个功能代表一个如串行连接或 SCSI...
Linux configfs
translate from https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt configfs - 用户空间驱动的内核对象配置乔尔·贝克尔 joel.becker@oracle.com 更新日期:2005年3月31日 版权所有 (c) 2005 Oracle Corporation,乔尔·贝克尔 joel.becker@oracle.com 什么是 configfs?configfs 是基于内存的文件系统,它提供与 sysfs...
Linux USB mtp
USB mtp 介绍https://en.wikipedia.org/wiki/Media_Transfer_Protocol from wiki:MTP是一种高水平的文件传输协议,与通用串行总线大容量存储等通用存储协议相反。这意味着MTP客户端(计算机)看不到构成文件系统的数据结构的字节块数组,而是用文件和文件夹来表示MTP设备。这使得MTP设备可以参与高水平的操作(如更新其元信息索引),同时将文件系统的完整性掌握在自己手中。特别是,掉线传输(例如过早拔掉USB电缆)不会损坏设备文件系统。[6]MTP的非通用性会影响计算机操作系统如何向其他程序和用户呈现MTP设备。根据其规范,MTP的 主要目的是促进具有瞬态连接的媒体设备之间的通信。[5] 第二个目的是启用对连接设备的命令和控制。[5]电池供电的移动设备可以通过MTP报告其电池电量水平。[6] 该协议最初是为跨USB使用而实现的,但扩展为跨TCP/IP和蓝牙使用。Windows Vista支持TCP/IP上的MTP。带有Windows Vista平台更新的Windows 7和Windows...
Busybox init/reboot/poweroff
reboot/poweroffboards/default/dts/cv181x/cv181x_base.dtsi 中定义了 restart-controller 设备。 1234restart: restart-controller { compatible = "cvitek,restart"; reg = <0x0 0x05025000 0x0 0x2000>;}; drivers/power/reset/cvi-reboot.c 中实现了对应的一个平台驱动: 123456789101112static const struct of_device_id cvi_reboot_of_match[] = { { .compatible = "cvitek,restart" }, {}};static struct platform_driver cvi_reboot_driver = { .probe =...
Linux USB 驱动框架
depends on: bus 通用知识 uevent 机制 字符设备 USB 驱动框架很典型的Linux 驱动框架,分 核心层:完成通用功能。 设备驱动层 PDD(实现特定功能,比如 UVC, UAC, HID 这些类型的设备驱动) 控制器驱动 HCD(配置寄存器去操作硬件USB IP,完成数据收发)类似与网络中的数据链路层,只负责数据收发。 image from paper 这段 USB Driver Architecture 讲得很好。 USB (Universal Serial Bus) 17) is one of the sophisticated peripheral interfaces based on the recent hardware progress. In the USB 2.0 specification announced in April 2000, a host computer controls various USB devices with 3 transfer speeds (1.5 Mbps, 12.0 Mbps,...
Scripts-管理多个 git 仓库
脚本12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879#!/bin/bash# ANSI颜色码RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[0;33m'BLUE='\033[0;34m'NC='\033[0m' # 恢复默认颜色# Define special charactersOK_STATUS=$'\u2714' # ✅FAIL_STATUS=$'\u274C' # ❌# 保存当前目录current_dir=$(pwd)command_to_execute="\$1"# git logfunction git_log...
Alios USB camera 常见需求处理
配置说明组件配置每个组件都有一个 .yaml 配置文件,主要关注: 12def_config: # 组件的可配置项 CONFIG_XXX: 1 def_config 下的配置都会以宏定义的形式来影响代码。就相当于在编译时多了 -DCONFIG_XXX=1 这样。 Solution 配置Solution 也有一个 yaml 的配置文件,也包含 depends、def_config 等配置项,这里单独来讲主要是想强调 def_config 这个配置,Solution 下的配置文件中,可以修改任意组件的 def_config 。也就是说,每个组件下的配置文件中,def_config 下配置相当于是默认配置。如果 Solution 下的配置项与组件的下配置不一致,以 Solution 的为准。 ❗❗强调:Solution 下的配置会对所有组件生效,所以在定义配置的时候,注意配置名是否与其他组件重复了(可以重复,但要确认这是你期望的)。 用户常用改动 板卡内存大小 1CONFIG_DRAM_CFG: "128m" 配置 UVC...
UVC 扩展单元
常见问题 UVC 扩展单元的作用是啥? 《UVC 1.5 Class specification》 的 2.7, 3.7.2 中介绍了 UVC 的控制接口包含:输入终端、输出终端、相机终端、选择器单元、处理单元、编码单元、扩展单元。前几个都是类标准中有指定应该实现什么功能的,扩展单元就是专门给厂商实现自定义的一些功能。 比如我们这里客户需要能给设备发送重启指令。 和 UVC 的关系是啥? UVC 扩展单元是 UVC 的一个可选的小功能。 如何实现与测试? 测试可使用: Bus Hound,可给设备发送任意命令。分免费版和付费版,我们这里只用来发指令,免费版就够用了。官方网址:https://www.perisoft.net/bushound/index.htm UVCXU摄像头扩展单元调试工具UVCXU-USB中文网官方版,需要加QQ群下载。 wireshark 抓包分析。 BusHound 是直接转到驱动去发的,没有通过 windows 视频类驱动,而UVCXU调试工具时调用了 windows 视频类驱动,就会受到 windows...
CLANG FORMAT 格式化代码
VSCODE CLANG FORMAT 格式化 获取 linux 的 clang-format.txt https://github.com/torvalds/linux/blob/master/.clang-format 放到项目的根目录,并命名为 .clang-format vscode 准备 c/c++ 插件, 在VSCode中安装的多个插件均支持使用clang-format来对代码执行格式化,此时按照上述文章中的方法完成配置后,代码格式化并没有生效。后来无意中发现,需要在VSCode的配置文件中增加如下配置,从多个插件中选择默认启用的格式化工具。 123"[cpp]": { "editor.defaultFormatter":...
buildroot 打包 rootfs
Cvitek buildroot 打包 rootfs 流程介绍 基于 https://github.com/sophgo/cvi_mmf_sdk/tree/v4.1.0 的实现。 概述在 cvi_mmf_sdk 中,支持两种生成 rootfs 的方式: 基于 ramdisk 目录下的文件系统。 基于 buildroot 打包生成文件系统。 前者仅保留了常用的一些工具,因此生成的文件系统较小,不过新增工具比较麻烦。后者方便用户自己控制需要打包哪些工具。 默认使用第一种方式来生成文件系统,可通过在板子的配置文件中加上 CONFIG_BUILDROOT_FS=y (如 cv1812cp_sophpi_duo_sd_defconfig#L30 中的例子),以启用 buildroot 来生成文件系统。 rootfs 打包流程说明在 source cvisetup.sh 之后,就可以使用 pack_rootfs 命令来打包文件系统了。它本质上是定义在 common_functions.sh 中的一个 shell 函数,在设置必要的环境变量后,通过 make...
Linux 系统编程-syslog
syslog这里说的 syslog 仅仅是api,man 3 syslog 有详细的说明。简单来说,如下图所示,应用通过 syslog() 这个调用将日志信息传递给 syslogd(我们可以称为日志收集器)。syslogd 可以根据配置文件(一般位于 /etc/syslog.conf 来决定如何处理日志信息)。比如保存到某个文件、发送到远程主机、显示到控制台等。 12345678910111213 app1 app2 app3 (产生日志) │ │ │ │ │ syslog() │ (AF_UNIX 传递日志) │ │ │ │ ┌───────▼──────┐ │ └──────────►│ syslogd │◄────────┘ (接收日志) ...
Linux 内核-中断
Linux 内核 — 中断什么是中断 本节更多的是对中断涉及的内容进行简单介绍,后续才会对各个内容详细介绍。 在 Linux 系统中,中断(Interrupt)是一种硬件或软件事件,它可以打断正在执行的 CPU 指令序列,使 CPU 转而处理某个特定事件。中断机制允许外部设备或系统组件通过发送信号来通知 CPU 某种事件的发生,这可以是来自硬件设备(如键盘、鼠标、硬盘等)的输入、定时器到期、网络数据包到达等等。 中断的主要目的是提供一种异步通信的方式,让 CPU 能够及时响应外部事件,而不需要持续地轮询检查事件是否发生。这样可以大大提高系统的效率和响应速度。 但中断过多反而会降低系统的效率!在网络收包处理中,往往采用中断+轮询的方式。 在 Linux 系统中,每种类型的中断都有一个唯一的标识号,被称为中断号。当一个中断事件发生时,CPU 会立即暂停当前执行的指令,保存当前上下文,然后跳转到与中断号相关联的中断处理程序。中断处理程序是一段预先编写好的代码,负责处理特定类型的中断事件。处理完中断事件后,CPU...
设备树语法介绍
设备树语法 什么是设备? 直观点:键盘、鼠标、内存、CPU、显示器、wifi、网卡、显卡是设备。 底层点:SPI 、I2C、I2S 、mipi、gpio、USB 等控制器。 Linux / Uboot 是如何管理这些设备的呢? 父子关系 I2C 等控制器与通过该控制器接入的设备,明显就是父子关系。 根设备 SPI、 I2C 控制器这样看起来没有关联的设备,他们就直接挂靠在根设备下。 为什么要有设备树? 这个和 Linux 的设备-驱动模型对应,驱动 - 设备分离,通过 Kconfig 定义的配置项决定是否启用驱动。设备是否启用则是由设备树来决定。 Linux 支持的设备类型很多很多,不可能将所有设备都启用(会浪费大量的内存、CPU资源)。设备树就是用来告诉 Kernel 需要启用哪些设备。 语法说明设备树 dtsi 文件中使用 c 语言的方式注释 /* 注释 */ 以及 // 注释,特别注意 # 是有特殊意义的,不是注释!! 设备之间的父子关系,用文本表示出来是用 {} 管理的包含关系。 123456789101112/...
Cvitek-安全启动
Cvitek-安全启动 注:仅考虑 cv181x 安全启动的意义: 防止用户烧录未经授权的固件。(签名) 防止通过固件拷贝,来抄袭产品。(签名+加密) 原理介绍加密算法介绍 盘点五种最常见加密算法! 密码学基本概念 算法整体上可以分为**不可逆加密,以及可逆加密,可逆加密又可以分为对称加密和非对称加密**。 不可逆这部分称为 消息摘要 更好,摘要算法就是我们常说的散列函数、哈希函数(Hash Function),它能够把任意长度的数据“压缩”成固定长度、而且独一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”。 消息摘要散列算法,就是一种不可逆算法,无法从散列结果中反推出明文。可以用来检验数据是否被更改。 散列算法中,明文通过散列算法生成散列值,散列值是长度固定的数据,和明文长度无关。 散列算法的具体实现有很多种,常见的包括 MD5、SHA1、SHA-224、SHA-256 等等。 散列算法常用于数字签名、消息认证、密码存储等场景。 本文中,对 kernel、rootfs 的签名就是基于 sha256 实现(不过还用到了下面的...
gdb
GDB 备忘清单本清单提供了对 GDB 的入门简要概述,以及 GDB 常用示例,完整文档参阅 Debugging with gdb,该文档最后有 GDB index,可以快速查找命令。 入门 常用命令 [] 内为命令缩写 命令 [缩写] 说明 help[h] 查看命令帮助。如 help run run[r] 运行程序。可搭配参数使用 start 运行程序,停在第一条执行语句。可搭配参数使用 list[l] 查看程序源码 break[b] 设置断点。可指定文件名、函数名和行号等参数来设置断点 watch 设置监视点。当监视的变量发生更改时,程序会被中断 delete 删除断点等。可用于删除断点、监视点、display...