Yuhang Zheng
锂电池充放电电压注意事项

我目前手边上有一个7.4v的锂电池,因为不常用,又怕总是搁置着会慢慢给放坏,所以网上查了一下7.4v锂电池的充电注意事项,特此记录一下。

7.4V一般是2串锂电的电池组,这也可以从电池的充电接口看到,一般是一个3p的接口,如果用万用表去测量的话,分别为0v,一串电池的电压,两串电池的电压。

单串电池的充放电范围是4.2V-2.7V,也就是说,如果电池电压一致性比较好的话,充电的满电电压是8.4V,放电的最低电压是5.4V。

如果没有保护板的话在5.4V以下也许用电器还能工作,但电池已经不能再用了,会损失寿命,需要充电再用。

另外锂电池对电压上下限很敏感,经常超高或超低会极大地损失循环寿命。

也就是对于7.4v的锂电池来说

满电 标称 停止 终止
8.4v 7.4v 7.0v 6.0v

在内核驱动文件./drivers/power/supply/da9052-battery.c中,有以下内容

    {
    {4102, 100}, {4065, 98},
    {4048, 96}, {4034, 95},
    {4021, 93}, {4011, 92},
    {4001, 90}, {3986, 88},
    {3968, 87}, {3952, 85},
    {3938, 84}, {3926, 82},
    {3916, 81}, {3908, 79},
    {3900, 77}, {3892, 76},
    {3883, 74}, {3874, 73},
    {3864, 71}, {3855, 70},
    {3846, 68}, {3836, 67},
    {3827, 65}, {3819, 64},
    {3810, 62}, {3801, 61},
    {3793, 59}, {3786, 58},
    {3778, 56}, {3772, 55},
    {3765, 53}, {3759, 52},
    {3754, 50}, {3748, 49},
    {3743, 47}, {3738, 46},
    {3733, 44}, {3728, 43},
    {3724, 41}, {3720, 40},
    {3716, 38}, {3712, 37},
    {3709, 35}, {3706, 34},
    {3703, 33}, {3701, 31},
    {3698, 30}, {3696, 28},
    {3693, 27}, {3690, 25},
    {3687, 24}, {3683, 22},
    {3680, 21}, {3675, 19},
    {3671, 18}, {3666, 17},
    {3660, 15}, {3654, 14},
    {3647, 12}, {3639, 11},
    {3630, 9}, {3621, 8},
    {3613, 6}, {3606, 5},
    {3597, 4}, {3582, 2},
    {3546, 1}, {2747, 0}
    },

由上可以看到,当单串电池电压到3.5v时,电池电量已经接近于0了,所以平时在放电的时候,要注意电池组电压不要低于7v

wm8960芯片驱动打印寄存器方法

目前在调试wm8960芯片的时候遇到一个问题,需要能够打印wm8960芯片上的寄存器的值。

但是通过wm8960的手册我们知道,它的寄存器地址是7为,数据是9位,不是标准的i2c协议的情况,只支持了i2c来写寄存器,没有实现i2c读寄存器。

image-20220908105702728

handsome主题预览文章的问题

根据网页开发人员工具中的报错

from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow

确定是apache2设置跨域的问题,首先使能apache2的头部请求模块

root@73b0c7f2587a:/var/www/html# a2enmod headers.load
Enabling module headers.
To activate the new configuration, you need to run:
  service apache2 restart
root@73b0c7f2587a:/var/www/html# service apache2 restart

其次是修改apache2的配置,修改

/etc/apache2/sites-enabled/000-default.conf

增加

        Header set Access-Control-Allow-Origin *
        Header set Access-Control-Allow-Credentials true
        Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept"

如果是使用的nginx搭建的网站,则需要修改配置文件,在location关键字下增加

location / {
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        }

然后根据网页开发人员工具中的报错

The document is sandboxed and lacks the 'allow-same-origin' flag.

确定是iframe中的sandbox缺少’allow-same-origin’属性的问题

修改Typecho根目录中的

./admin/write-js.php

文件,修改如下

    function previewData(cid) {
        isFullScreen = $(document.body).hasClass('fullscreen');
        $(document.body).addClass('fullscreen preview');

        var frame = $('<iframe frameborder="0" class="preview-frame preview-loading"></iframe>')
            .attr('src', './preview.php?cid=' + cid)
            .attr('sandbox', 'allow-scripts allow-same-origin')
            .appendTo(document.body);

        frame.load(function () {
            frame.removeClass('preview-loading');
        });

        frame.height($(window).height() - 53);
    }

主要是这一句话

.attr('sandbox', 'allow-scripts allow-same-origin')
Linux下amixer指令用法

amixer简介

amixer是命令行形式的配置指令,可以对ALSA(Advanced Linux Sound Architecture)架构类型的声卡驱动提供的接口进行音频参数配置,例如音量调节以及声卡开关。并且该amixer功能指令可以对多种类型声卡驱动接口进行配置。

另外注意还有alsamixer,作用和amixer一样,用于配置ALSA架构声卡各个音频参数,但是以图形界面形式显示,操作方便,显示直观。

amxier可以调节系统对应声卡的音量和选择音频通道。

amixer命令格式

使用 amixer命令如下:

amixer [-option] [cmd] 

amixer支持的功能

终端下输入#amixer -h查看amixer支持的功能和选项:

root@forlinx:~# amixer -h
Usage: amixer <options> [command]

Available options:
  -h,--help       this help
  -c,--card N     select the card
  -D,--device N   select the device, default 'default'
  -d,--debug      debug mode
  -n,--nocheck    do not perform range checking
  -v,--version    print version of this program
  -q,--quiet      be quiet
  -i,--inactive   show also inactive controls
  -a,--abstract L select abstraction level (none or basic)
  -s,--stdin      Read and execute commands from stdin sequentially
  -R,--raw-volume Use the raw value (default)
  -M,--mapped-volume Use the mapped volume

Available commands:
  scontrols       show all mixer simple controls
  scontents       show contents of all mixer simple controls (default command)
  sset sID P      set contents for one mixer simple control
  sget sID        get contents for one mixer simple control
  controls        show all controls for given card
  contents        show contents of all controls for given card
  cset cID P      set control contents for one control
  cget cID        get control contents for one control

上述指令对于amixer功能只是一个简单描述输出,具体解释可以输入#man 1 amixer查询。

自己理解的一些命令区别如下:

“controls”表示输出全部声卡驱动接口列表
“contents”表示输出全部声卡驱动接口列表以及对每个接口属性内容描述,接口的类型,值的大小
“scontrols”表示一些简单的接口的列表
“scontents”表示一些简单的接口的列表以及对每个接口属性内容描述,接口的类型,值的大小
关于wm8960音频芯片播放音频文件时的时钟测量

我们已经知道,对于WM8960音频芯片的Codec来说,与SOC连接的一共是有5个引脚:

DACLRC                    数字转模拟左右声道时钟
BCLK(Bit Clock)           位时钟
ADCDAT                    模拟转数字数据(录音数据)
DACDAT                    数字转模拟数据(放音数据)
MCLK                    外部24M时钟

关于这些引脚的作用,可以参看文章《音频的IIS引脚的理解》

这篇文章仅仅讨论播放音频文件时候的情况。

当播放音频文件时,使用示波器测量出来的LRC时钟就是音频的采样频率时钟,如果 /etc/asound.conf文件存在的话,那么LRC时钟就是使用的配置文件中设置的时钟,大多数是44.1kHz或者22.05kHz。

否则的话,LRC时钟就等于播放的音频文件的采样率大小。

使用file命令可以查看音频文件的采样率:

image-20220613165648571

从上面的例程中可以发现:

/forlinx/media/test.mp3:采样率:44.1 kHz
/run/media/sda1/ddd/1K_sin.mp3:采样率:48 kHz
/run/media/sda1/ddd/1K_sin.wav:采样率:11.025 kHz
Linux系统实现SATA热插拔功能

日前,工作中遇到了一个SATA热插拔的需求,客户想要在系统使用过程中能够通过一个开关来做控制,支持在不重启系统的情况下实现SATA硬盘的热插拔。

为了实现此功能,硬件设置如下:

GPIO2_3用于一个船型开关,开关闭合(船型开关置“1”)时与GND短路。
SATA_PWRLED连接LED,指示SATA电源,点亮表示SATA供电。
SATA_STALED连接LED,指示硬盘运行状态。

概况来说,就是有以下资源:

一个DI输入,接了一个船型开关,可以通过拨动开关来获取01值
一个DO输出,控制着SATA硬盘的电源,并连接了一个LED灯
一个DO输出,连接了一个LED灯,可以配置成指示SATA硬盘的读写状态(与实现SATA热插拔功能无关)

软件上想要实现的逻辑如下:

插入硬盘:

在SATA电源灯熄灭状态下,插入硬盘
拨动船型开关置“1”
SATA电源灯亮起,状态灯闪烁
硬盘正常工作

拔出硬盘:

拨动船型开关置“0”
稍等片刻,待SATA电源灯熄灭
拔出硬盘即可
关于动态库的链接调用问题的排查

日前在移植LSDK2108的时候,发现在启动weston服务的时候会报以下的错误

root@forlinx:~# weston --tty=1
Date: 2022-04-09 CST
[16:30:47.231] weston 9.0.0
               https://wayland.freedesktop.org
               Bug reports to: https://gitlab.freedesktop.org/wayland/weston/issues/
               Build: lf-5.10.35-2.0.0-rc2-1-gbf611255
[16:30:47.232] Command line: weston --tty=1
[16:30:47.232] OS: Linux, 5.10.35-g46e1a09b0512, #1 SMP PREEMPT Sat Apr 9 13:20:41 CST 2022, aarch64
[16:30:47.233] Using config file '/etc/xdg/weston/weston.ini'
[16:30:47.234] Output repaint window is 7 ms maximum.
[16:30:47.235] Loading module '/usr/lib/libweston-9/drm-backend.so'
[16:30:47.239] initializing drm backend
[16:30:47.244] using /dev/dri/card0
[16:30:47.245] DRM: supports atomic modesetting
[16:30:47.245] DRM: supports GBM modifiers
[16:30:47.245] DRM: supports picture aspect ratio
[16:30:47.245] Loading module '/usr/lib/libweston-9/gl-renderer.so'
[16:30:47.268] Failed to load module: /lib/libEGL.so.1: undefined symbol: gbm_surface_set_in_fence_fd
[16:30:47.268] failed to initialize egl
[16:30:47.269] fatal: failed to create compositor backend
Internal warning: debug scope 'drm-backend' has not been destroyed.

从错误上来看,就是加载/lib/libEGL.so.1模块的时候找不到gbm_surface_set_in_fence_fd符号

我们可以使用ldd -r /lib/libEGL.so.1命令来验证这一问题

root@forlinx:~# ldd -r /lib/libEGL.so.1
        linux-vdso.so.1 (0x0000ffff9ae6f000)
        libGAL.so => /lib/libGAL.so (0x0000ffff9ac04000)
        libwayland-server.so.0 => /lib/aarch64-linux-gnu/libwayland-server.so.0 (0x0000ffff9abe0000)
        libwayland-client.so.0 => /lib/aarch64-linux-gnu/libwayland-client.so.0 (0x0000ffff9abc1000)
        libdrm.so.2 => /lib/aarch64-linux-gnu/libdrm.so.2 (0x0000ffff9ab9f000)
        libgbm.so.1 => /lib/aarch64-linux-gnu/libgbm.so.1 (0x0000ffff9ab81000)
        libgbm_viv.so => /lib/libgbm_viv.so (0x0000ffff9ab6c000)
        libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000ffff9ab3c000)
        libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff9a9c9000)
        /lib/ld-linux-aarch64.so.1 (0x0000ffff9ae3f000)
        libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffff9a91c000)
        libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000ffff9a908000)
        libffi.so.7 => /lib/aarch64-linux-gnu/libffi.so.7 (0x0000ffff9a8ef000)
        libexpat.so.1 => /lib/aarch64-linux-gnu/libexpat.so.1 (0x0000ffff9a8b8000)
undefined symbol: gbm_surface_set_in_fence_fd   (/lib/libEGL.so.1)

在上面的打印信息中,我们也看到了/lib/libEGL.so.1所链接的其他动态库

ARM平台获取CPUID的方法

目前工作中需要获取LS10xx平台的CPUID,然后网上搜到了一些方法,在这里先简单记录一下。

CPUID寄存器内容:

字段名:Implementer(venter 销售ID)|Variant(大版本号) | Architecture(架构版本)| Part Num(产品代码)|Revision(小版本号)

基址偏移量: [31-24] | [23-20] | [19-16] | [15-4] | [3-0]

下面直接上操作,以LS1046为例

1、使用cat /proc/cpuinfo命令可以看到

root@localhost:~# cat /proc/cpuinfo
processor       : 0
BogoMIPS        : 50.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 2

processor       : 1
BogoMIPS        : 50.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 2

processor       : 2
BogoMIPS        : 50.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 2

processor       : 3
BogoMIPS        : 50.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 2

按照上面的规则换算下来就是

Implementer        |Variant    | Architecture    |Part Num    |Revision
0x41            0            f                d08            2
LS10xx安全架构和安全启动

一、信任架构概述

QoriQ平台的信任架构可以使开发者仅仅靠运行”授权软件程序“来保护您设计的产品,并提供工具在运行环境的生命周期内不间断的检测硬件的安全状态,在运行时环境中检测到的异常会触发硬件状态更改,从而导致系统锁定对先前加密数据的访问或重启硬件。

所有具有信任架构的QorlQ Layerscape 设备都支持以下两种启动模式:

  • 正常启动(不信任环境)
  • 安全启动

预引导加载程序 pre-boot loader(PBL)允许您在正常引导或安全引导之间进行选择。有两种方法可以命令PBL启动安全启动过程:

  • 对正在运行的系统的安全意图 intent to secure(ITS)保险丝进行编程
  • 在原型设计之初就在RCW中设置启用安全启动 secure boot enable(SB_EN)位

在安全启动模式下,数字签名的启动映像会在启动期间进行验证。验证期间的失败要么使CPU进入自旋循环(具有ITS的系统),要么继续引导到非安全状态(具有SB_EN的环境)。

使用信任架构需要一些强制性最低配置可选配置

强制性最低配置和程序包括代码签名对安全熔断器处理器(SFP)中的某些字段进行编程

可选配置包括对一些增强功能的支持,例如篡改检测(tmp_detect)运行时完整性检查(RTIC)安全调试密钥撤销和安全数据存储(加密的二进制数据)

二、安全启动:最低要求

安全启动过程包括对现有软件必要的准备工作对安全启动过程使用的熔丝进行编程

在安全启动模式下,SoC的CPU是从一段包含内部安全启动代码 internal secure boot code(ISBC)的不可修改的内部启动ROM开始启动的。

ISBC的功能是去验证一段被称为外部安全启动代码 external secure boot code(ESBC)的可修改代码。

ESBC可以是一个与引导设备(U-Boot、设备树、内核、rootfs)相关的连续内存空间中的单个集成镜像,也可以是存在于软件镜像链的第一阶段中可以单独验证和调用的程序。第二阶段也称为信任链。使用信任链时,您可以为链中的每个镜像使用单个密钥对,或为不同的镜像使用不同的密钥对。

为简单起见,本文档使用单个密钥对对安全启动中涉及的所有镜像进行签名。

使用fw_printenv修改uboot环境变量

最近遇到一个问题,有客户想要使用fw_printenv命令,在文件系统下查看和修改uboot环境变量。

网上搜索了一下相关的内容,发现fw_printenv真是一个好东西。

首先是fw_printenv工具的编译:

fw_printenv工具的源码在uboot源码目录下的tools/env/目录下,可以使用以下命令直接编译得到

make env ARCH=xxx CROSS_COMPILE=yyy
#其中xxx和yyy根据自己的交叉编译环境来配置

编译完成之后,就在tools/env下生成fw_printenv的可执行文件,将其拷贝到文件系统中就可以。

其次是fw_env.config文件的配置:

fw_env.config文件在文件系统的/etc目录下,记载着mtd分区、uboot环境变量的位置、大小等内容。

在uboot源码的tools/env/fw_env.config中也有一个简单的示例,具体的修改方法见fw_env.config文件中的说明及/tools/env/README文件。

对于LS1046来说,fw_env.config文件中的内容如下:

# MTD device name       Device offset   Env. size       Flash sector size
/dev/mtd0               0x300000          0x2000          0x40000

其中Device offset,Env size和Flash sector size应该分别对应于uboot源码目录中include/configs/xxxx.h相关文件中的

CONFIG_ENV_OFFSET,CONFIG_ENV_SIZE和CONFIG_ENV_SECT_SIZE三个宏定义

以include/configs/ls1046ardb.h为例,我们可以看到

#define CONFIG_ENV_SIZE                 0x2000          /* 8KB */
#define CONFIG_ENV_OFFSET               0x300000        /* 3MB */
#define CONFIG_ENV_SECT_SIZE            0x40000         /* 256KB */