ThinkNotes

Simple is not easy | 化繁为简,知易行难

0%

Android驱动调试技术

Android嵌入式平台的系统要抓取驱动模块的log,一般不能像Linux系统直接在系统终端内配置,需要通过ADB(Android Debug Bridge)联机调试通道抓log。

ADB查看kernel log

ADB主机环境安装

windows主机可通过ADB连接Android板子,登录到开发板的系统root文件目录操作rootfs,并配置和抓取板子的kernel log打印。

Windows主机装ADB环境需要两个东西:

  1. 安装ADB exe包

在google andoid下载platform tools,即adb包

https://www.thecustomdroid.com/google-android-usb-drivers/

  1. 安装USB-ADB驱动
阅读全文 »

HP SBOM release pack创建方法

背景

基于软件供应链相关安全法案U.S. Executive Order 14028’s “minimum elements” for SBOM,HP要求 SBOMs must include all NTIA-required fields at the component level, appropriately mapped to the CycloneDX schema

操作流程

安装uswid工具

安装python3.12(或其他3.1x高版本),再安装pip包管理器:

1
python -m ensurepip --upgrade

安装uswid工具:https://github.com/hughsie/python-uswid#

1
pip install --user uswid

安装完毕后在C:\Users<用户名>\AppData\Roaming\Python\Python312\Scripts会有uswid.exe程序

阅读全文 »

hexo博客和next主题环境搭建

本文描述搭建hexo博客环境以及配置next主题的过程

主环境安装

安装node js

https://nodejs.org/en/

用cmd检验一下是否安装成功:用 node -v 和 npm -v 命令检查版本

安装hexo

新建文件夹 如hexo-blog,在此目录安装hexo:

1
npm install -g hexo-cli

安装完的目录如下,详细见:https://hexo.io/zh-cn/docs/setup

阅读全文 »

Github.io域名替换支持国内访问

hexo blog部署到github.io pages后,访问不稳定。通过clash机场代理才能稳定访问。

原因是大多数国内网络商拉黑了github.io域名,也就是DNS的问题,并不是IP问题。所以使用自定义域名就可以解决。

由于github pages本身是国外服务器,域名也可以直接在国外购买不用备案;不需要像国内服务器必须买国内域名且要备案。

域名使用https://www.namesilo.com/,支持支付宝,xyz域名很便宜一年10块钱。

本文参考:

配置 GitHub Pages 站点的自定义域

Github 部署个人网页 | 自定义域名

namesilo域名配置

购买域名后,如下图有两种方式配置DNS,方式1,添加CNAME别名指定域名为github.io的别名。方式2,使用github模板,添加type A的4个IP

阅读全文 »

Markdown的公式和流程图快速转化为word/wps

使用AI工具对代码快速梳理出包含流程图和公式的markdown文档,markdown包含mermaid和LaTeX,直接用typora导出word格式不成功,需要借助drawio和pandoc命令行。

pandoc转化latex公式

使用命令行,将Markdown转换为Word,latex公式以MathML格式嵌入Word

1
pandoc input.md -o output.docx --mathml

注意直接用typora里面调用pandoc是转不了公式的,必须用pandoc命令行–mathml

参考 科研神器Pandoc:秒将包含LaTeX公式的Markdown转换为Word

drawio转化mermaid流程图

将markdown的mermaid流程图代码插入drawio:调整图像->插入->高级->mermaid

然后手动调整流程图曲线,最后另存为png图片,插入word。

阅读全文 »

SD Host Retimer简介

信号完整性与Redriver/Retimer

信号完整性(Signal Integrity, SI)

(1)数字信号与眼图

简单地讲,数字信号的逻辑0、1是依赖于模拟信号的高低电平

如下图,CMOS电平下,3.3V~2V为逻辑1,0.8V~0V(GND)为逻辑0;TTL电平下是5V~2V为逻辑1,0.8V~0V(GND)为逻辑0。

image-20251118142056872

考虑到模拟信号的跳变是有个过程的,如下图,在模拟电平还没达到数字逻辑0、1对应的电压时(下图Rise time和fall time的阶段),此时采样的数据是无效的。只有模拟电平达到逻辑0、1对应的电压时(下图Bit period),才能对信号采样,得到正确的逻辑0、1。

下图即眼图,能得到正确的逻辑0、1的采样区间越大,信号质量越好。

image-20251118142126961

阅读全文 »

SD Spec常用流程摘要

SD legacy初始化流程

SD legacy初始化是指所有SD卡在SD模式下的通用初始化流程,在此流程之后才可能指向UHS-I,UHS-II的初始化流程。

流程图见SD physical spec:

CMD0:GO_IDLE_STATE:使卡进入Idle state,即卡复位状态

CMD8:SEND_IF_COND:验证卡接口(I/F)的operating conditon(COND),根据返回值的bit判断卡类型,这里不细讲,legacy初始化只看卡有没有返回CMD8,如果返回,获取到卡支持的电压(3.3V/1.8V),后面再用这个电压值。

ACMD41(CMD55+CMD41):SD_SEND_OP_COND:设置operating conditon,相当于根据CMD8的结果,host发起对卡的配置请求。ACMD41并不指向具体的卡设置,可理解为设置流程之前的握手。

CMD11:Voltage Switch:切换Host和SD card之间的信号电平,一般从3.3V切到1.8V,电压切换包括CLK,DATA,CMD线。注意这里的电压切换不是指通信电平的电压,而不是SD卡的供电电压VDD。

CMD2:SEND_CID:Card Identification,获取卡的CID,此命令完毕后卡从idle state进入identify state。

CMD3:SEND_RCA:Relative Card Address,获取卡的地址(来自于卡的RCA register),此命令完毕后卡进入stand-by state(属于data transfer mode中的一种子状态)。

阅读全文 »

QCOM BH202 SDR50 tuning问题

问题描述

现象:QCOM+BH202平台,SDR50模式下,Host侧发送tuning CMD19命令处理响应失败(TIMEOUT),导致无法工作在SDR50模式,BH202驱动log打印wait DLL unlock和CMD19 timeout。其他模式如SDR104模式可以正常工作。

分析:经SD CMD/DATA line信号测量,SD card发送了CMD19的响应,问题出在SD Host侧未处理响应。

问题指向SD Host侧在SDR50模式的tuning配置有问题。

解决方案

BH202 tuning sdr50.drawio

如图是SD Host - BH20X bridge - SD card系统。

通常SD Host直连SD card时,SDR50模式host clock <=100MHz, 不需要执行SDR50 tuning流程,SDR50 tuning只是可选项。

但是BH20X bridge的数字逻辑要求SDR50模式下也走SDR50 tuning流程,否则SDR50模式无法正常工作。

阅读全文 »

Qualcomm HDK845开发环境

初始环境搭建(离线BSP包)

按SDM845(Open-Q 845 HDK) BSP v2.1 离线编译包中的README操作:

离线包约80GB,不需要翻墙下载android AOSP repo,只需要把Linux PC交叉编译环境搭好就能编译完整系统。

注意Linux系统必须使用Ubuntu18.04,其他版本有apt-get找不到包的问题。


本压缩包(Open-Q_845_Android-P_v2.1.offline.tar)在原厂BSP编译包(Open-Q_845_Android-P_v2.1.zip)的基础上包含了CAF源码库,可直接编译,无需再从外网下载代码库。

建议先阅读原厂文档中对应的Programmer’s Guide(PG), e.g., Intrinsyc Open-Q_845 Development Kit BSP Programmer Guide_v1.0.pdf.

本离线编译包涉及如下非原厂文件:

  1. ./bm_README.txt
    本说明文档。
  2. Source_Package/bm_getSource.sh
    该脚本为我们解压完原厂BSP编译包后运行的第一个脚本。它仅仅从CAF下载完代码库。
  3. Source_Package/bm_first_build.sh
    该脚本将不再下载代码库,顺序执行:应用Patches, 解压专属代码/库,执行编译。 前两步需要且只能执行一次。
  4. Source_Package/bm_rebuild.sh
    该脚本仅执行编译。
阅读全文 »

Qualcomm sdhci dts分析

clocks部分

sc7280.dtsi中,sdhc的clocks属性如下:

1
2
3
4
5
/* 定义clocks数组,包含三个时钟的值 */
clocks = <&gcc GCC_SDCC1_AHB_CLK>, /* 第一个值,见gcc对象数组的索引GCC_SDCC1_AHB_CLK的成员的值 */
<&gcc GCC_SDCC1_APPS_CLK>, /* 第二个值,见...对象的...成员的值 */
<&rpmhcc RPMH_CXO_CLK>; /* 第三个值,见rpmhcc对象数组的索引RPMH_CXO_CLK的成员的值 */
clock-names = "iface", "core", "xo"; /* 以上三个clocks的数组成员,分别命名, 例如"xo"就对应第三个值 */

以”xo”这个clock为例,看下这个clock值到底是多少。

首先找&rpmhcc这个对象,这里有隐藏知识:rpmhcc是个”Clock providers”对象,一定是用”clock别名: clock-controller”的格式定义,在当前SOC dts搜索“rpmhcc: clock-controller”就直接找到其定义:

1
2
3
4
5
6
rpmhcc: clock-controller {
compatible = "qcom,sc7280-rpmh-clk"; /* 这里很重要! */
clocks = <&xo_board>; /* rpmhcc的clocks源是xo_board */
clock-names = "xo"; /* 当前clock别名xo */
#clock-cells = <1>; /* 有两个clock输入(cells是0-based),即xo_board应该有两组值 */
};

这里很奇怪:

  1. rpmhcc没有定义regs,即没有直接定义他提供的时钟的值数值
  2. compatible是干吗用的?

原因见下图,clock provider提供的时钟值,是compatible指定的代码里面定义的!

阅读全文 »