查看GPIO使用信息:
cd /sys/kernel/debug/
cat gpio
查看GPIO复用信息:
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinc
trl/pinmux-pins
cd /sys/kernel/debug/
cat gpio
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinc
trl/pinmux-pins
12木
34火
56土
78金
90水
1、通过读取系统文件节点获取相应CPU温度
cpu0:
cat /sys/class/thermal/thermal_zone0/temp
cpu1:
cat /sys/class/thermal/thermal_zone1/temp
2、读取cpu温度失败问题
RK3288使用TSADC(Temperature-Sensor ADC)来测量CPU温度,支持两种模式:
用户自定义模式: 主动控制读取温度.
自动模式: 自动检测温度,达到阀值就自动报告.
dts配置如下:
&tsadc {
rockchip,hw-tshut-mode = <0>; /* tshut mode 0:CRU 1:GPIO */
rockchip,hw-tshut-polarity = <0>; /* tshut polarity 0:LOW 1:HIGH */
status = "okay";
};
tsadc: tsadc@ff280000 {
compatible = "rockchip,rk3288-tsadc";
reg = <0x0 0xff280000 0x0 0x100>;
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru SCLK_TSADC>, <&cru PCLK_TSADC>;
clock-names = "tsadc", "apb_pclk";
assigned-clocks = <&cru SCLK_TSADC>;
assigned-clock-rates = <5000>;
resets = <&cru SRST_TSADC>;
reset-names = "tsadc-apb";
pinctrl-names = "init", "default", "sleep";
pinctrl-0 = <&otp_gpio>;
pinctrl-1 = <&otp_out>;
pinctrl-2 = <&otp_gpio>;
#thermal-sensor-cells = <1>;
rockchip,hw-tshut-temp = <95000>;
status = "disabled";
};
用指令读取CPU温度:cat sys/class/thermal/thermal_zone0/temp,会报错/system/bin/sh: cat: temp: Invalid argumen。
看开机log,发现有如下报错:
clk: couldn’t get clock 0 for /tsadc@ff280000
说明tsadc缺少clock,查看dts,确实是少了这块。
xin32k: xin32k {
compatible = "fixed-clock";
clock-frequency = <32768>;
clock-output-names = "xin32k";
#clock-cells = <0>;
};
以为这个时钟加上就好了,令人抓狂的是,就加了这么几行代码,机器竟然一直重启开不起机了。
加的这个地方是跟温度是相关的,那就从这个方面入手去思考找问题。会不会是检测到温度的过温阀值,导致重启的呢?
看硬件的连接上:
主控的OTP 引脚是有连接出来到pmic rk808的,如果这个阀值到了reset脚就会动作,然后重启。
由于没有硬性需求一定要这个温度到了阀值就重启的需求,这个时候可以把硬件上的连接电阻去掉,或者软件上把reset的io屏蔽掉。实际起作用的是:pinctrl-1 = <&otp_out>;
屏蔽掉,这时候机器就可以正常开机了。
再查看温度值:cat sys/class/thermal/thermal_zone0/temp
54111
就能正常读到温度值了。
不过不太能理解的是,配置里 rockchip,hw-tshut-temp = <95000>;是超过95度才重启,一开机应该也不会超过阀值才对,开机后读取的温度也就50°C。
1、编写dockers配置文件
使用 dockerfile 创建容器,在容器中进行编译,完美解决编译环境问题,并且与主机环境隔离,互不影响。
首先在主机中安装 docker,请参考:安装教程
创建一个目录作为 docker 工作目录,例如~/docker/
,在其中创建文件dockerfile
,内容如下:
FROM ubuntu:18.04
MAINTAINER firefly "service@t-firefly.com"
ENV DEBIAN_FRONTEND=noninteractive
RUN cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
RUN sed -i 's@http://.*ubuntu.com@http://repo.huaweicloud.com@g' /etc/apt/sources.list
RUN apt update
RUN apt install -y build-essential crossbuild-essential-arm64 \
bash-completion vim sudo locales time rsync bc python
RUN apt install -y repo git ssh libssl-dev liblz4-tool lib32stdc++6 \
expect patchelf chrpath gawk texinfo diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake \
unzip device-tree-compiler python-pip ncurses-dev python-pyelftools \
subversion asciidoc w3m dblatex graphviz python-matplotlib cpio \
libparse-yapp-perl default-jre patchutils swig expect-dev u-boot-tools
RUN apt update && apt install -y -f
# language support
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
# switch to a no-root user
RUN useradd -c 'firefly user' -m -d /home/firefly -s /bin/bash firefly
RUN sed -i -e '/\%sudo/ c \%sudo ALL=(ALL) NOPASSWD: ALL' /etc/sudoers
RUN usermod -a -G sudo firefly
USER firefly
WORKDIR /home/firefly
2、创建镜像
cd ~/docker
docker build -t sdkcompiler .
# sdkcompiler 是镜像名称,可随意更改,注意命令最后有一个‘.’
# 此过程需要一段时间,请耐心等待
# 此处将主机内 SDK 所在文件夹挂载到容器内,这样容器内就能访问主机中的 SDK 了
# source= 填 SDK 所在目录;target= 填容器内的一个目录,必须是空目录
# ubuntu18 是容器名,firefly 是容器 hostname,均可随意更改
# sdkcompiler 是上一步的镜像名
docker run --privileged --mount type=bind,source=/home/fierfly/proj,target=/home/firefly/proj --name="ubuntu18" -h firefly -it sdkcompiler
# 在容器内输入 exit 即可退出
# 查看所有容器(包括已退出的)
docker ps -a
# 重启一个退出的容器并连接
docker start ubuntu18 # 容器名
docker attach ubuntu18
1、安装编译器
sudo apt install gcc-aarch64-linux-gnu -y
2、安装qemu虚拟器
sudo apt install qemu-system-arm -y
下载上面自动化部署脚本
1、扩展虚拟硬盘
fallocate -l 16G vdb.img
Node.JS 是一个基于 Google V8 引擎构建的开源后端 Javascript 运行时环境。它允许开发人员利用 JavaScript 创建命令行工具和服务器端脚本,包括在将页面发送到用户浏览器之前在服务器上运行脚本。Node.js 适用于大多数现代操作系统,包括 Ubuntu Linux。
sudo apt update
sudo apt upgrade
sudo apt install build-essential curl
1、从 NodeSource 存储库安装 Node.js。
默认情况下,Node.js 在 Ubuntu 22.04 基础存储库中不可用。现在运行以下命令将 NodeSource 存储库添加到您的 Ubuntu 系统:
wget -qO- https://deb.nodesource.com/setup_16.x | sudo -E bash
将 NodeSource 存储库添加到系统后,使用 Apt 包管理器安装 Node.js:
sudo apt install nodejs
2、使用 NVM 安装 Node.js。
现在使用 bash 脚本在你的 Ubuntu 系统上安装 NVM:
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
接下来,关闭并重新打开终端或运行以下命令将 nvm 加载到当前会话:
source $HOME/.bashrc
使用 NVM,您可以检查当前可用的 Node.js 版本:
nvm install --lts
nvm install node
确认已安装最新的 LTS 版本,运行命令:
node -v
此外,您可以使用以下命令检查 NPM 的版本:
npm -v
sudo apt-get install gcc
sudo apt-get install make
sudo apt-get install libaio1 libglib2.0-dev
sudo apt-get install git
sudo apt install -y gcc build-essential
git clone https://github.com/mkubecek/vmware-host-modules.git
cd vmware-host-modules
git checkout workstation-16.2.3(切到需要的分支)
make
sudo make install
$ chmod +x VMware-Workstation-Full-17.5.0-22583795.x86_64.bundle
$ sudo ./VMware-Workstation-Full-17.5.0-22583795.x86_64.bundle
sudo vmware
vmware-installer -l
Product Name | Product Version
vmware-player | 3.0.0.203739
sudo vmware-installer -u vmware-player
1、查看emmc是否存在
输入lsblk命令,是否可以看到有效的EMMC。如果可以查看到,说明已经识别有效EMMC,但是写入报IO操作,存在读写不稳定问题,可以采取降频来解决。
2、操作
apt-get update
apt-get install -y device-tree-compiler
cd /boot/dtb/amlogic/
dtc -I dtb -O dts -o meson-g12a-s905l3a-e900v22c.dts meson-g12a-s905l3a-e900v22c.dtb
mmc@ffe0700,将max-frequency里面内容改成0x5f5e100。
dtc -I dts -O dtb -o meson-g12a-s905l3a-e900v22c.dtb meson-g12a-s905l3a-e900v22c.dts
romboot打印初步解析
本解析说明适用于: gxb/gxl/txl/axg/txhd/gxlx/gxlx2/txlx/g12A/G12B/SM1/TM2/A1/C1/C2/SC2/T5/T5D/T7/S4
romboot中默认将其打印从AO uart这一路输出
以gxb nand 平台为例,其romboot的打印如下:
GXBB:BL1:08dafd:0a8993;FEAT:E0FC3184;POC:3;RCY:0;EMMC:800;NAND:85;SD:0;READ:0;CHK:0;
其可以拆分为如下部分:
1. GXBB:主芯片内部代号
2. BL1:08dafd:0a8993;FEAT:E0FC3184; bootrom相关启动信息,安全相关的同事会用到。
3. POC:3; Power on Config信息。表明设备启动顺序,可以参考下面的表格:
POC 1st Boot device 2nd Boot device 3rd Boot device 4th Boot device
0 USB SPI NAND/eMMC SD Card
1 SPI NAND/eMMC SD Card USB
2 USB NAND/eMMC SD Card -
3 NAND/eMMC SD Card USB -
4. RCY:0; HDMI recovery接口读到的值,可以实现更改第一启动介质的目的,通常用于拯救烧错主存储介质的板子,在开发阶段尤为有用;
0为无hdmi recovery小板;
1为usb boot的hdmi recovery小板;
2为sdcard boot的hdmi recovery小板;
5. EMMC:800;NAND:85;SD:0;READ:0;CHK:0
这个是默认的主存储介质的启动顺序,依序为EMMC->NAND->SD->USB,这里因为有烧好的启动卡插入,所以直接在sdcard这里跳了出来;
EMMC:800, 为emmc初始化过程,800表示报错,数值具体对应到emmc控制器的SD_EMMC_STATUS寄存器,此处800表示为resoponse timeout,这个报错信息无法看出是init过程中哪一条命令报错,最为有效的debug方式为接PA进行分析;
如果平台有焊接emmc,在初始化过程报了非0值,可以参照如下表格来确认是那条线的焊接不良;
Field
Name
Description
7:0
Rxd_err
RX data CRC error per wire,
for multiple block read, the CRC errors are Ored together.
8
Txd_err
TX data CRC error,
For multiple block write, any one of blocks CRC error.
9
Desc_err
SD/eMMC controller doesn’t own descriptor.
The owner bit is “0”, set cfg_ignore_owner to ignore this error.
10
Resp_err
Response CRC error
11
Resp_timeout
No response received before time limit.
The timeout limit is set by cfg_resp_timeout.
12
Desc_timeout
Descriptor execution time over time limit.
The timeout limit is set by descriptor itself.
Consider the multiple block read/write, set the proper timeout limits.
在焊接了emmc的情况下,EMMC初始化打印不为0,通常是hw相关的问题,需要顺序检查以下几个项目:
1. vcc/vccq的供电及上电顺序,二者上电间隔太长可能会引起emmc的初始化失败,详情可以咨询hw的fengjie(jie.feng@amlogic.com)
2. 如果是EMMC初始化报Resp_timeout/Resp_err,需请hw同事检查emmc的cmd线的连通性
3. 如果是EMMC初始化报Rxd_err/txd_err,需请hw同事检查对应的报错data线的连通性
**
Add @ 20180209
在G12A上,SD card的romboot初始化会首先检查GPIOC6的电平状态,如果为card未插入,则romboot会打印SD:20000
**
NAND:85,为nand初始化过程报错,数值为错误码,常用错误码有
#define ERROR_NAND_TIMEOUT 0x81
#define ERROR_NAND_ECC 0x82
#define ERROR_NAND_MAGIC_WORD 0x83
#define ERROR_NAND_INIT_READ 0x84
#define ERROR_NAND_BLANK_PAGE 0x85
SD:0;READ:0;CHK:0,为SD卡初始化OK,读取OK,并且校验OK;对于其他存储介质,在初始化OK后,同样会进行READ和CHK动作,返回值为0,则为OK,非0值,则有其各自对应的错误码,这里不做详细描述
1、配置psi-nor为驱动模块
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<M> SPI NOR device support --->
2、进入内核加载
modpro and insmod xxx.ko
spi-nor.ko