Yuhang Zheng
IEEE802.3和Ethernet II帧的区别

一、IEEE802.3和Ethernet II帧的区别

在这里插入图片描述

概念:
1、以太网上使用两种标准帧格式。第一种是上世纪80年代提出的DIX v2格式,即Ethernet II格式。第二种是1983年提出的IEEE 802.3格式。

2、两种格式得区别在于Ethernet 格式种包含一个Type字段,标识以太网帧处理完之后将被发送到哪个上层协议进行处理,IEEE 802.3格式种,同样位置是长度字段。

3、Ethernet II 格式相对使用广泛。

4、从Type/Length字段值可以区分两种帧类型:当Type字段值小于等于1500(0x05DC)时,帧使用的是IEEE 802.3格式。当Type字段值大于等于1536(0x0600)时,帧使用的是Ethernet II格式

千兆网之RGMII解析

一般来说,底板的千兆网大多选用RGMII和SGMII两种接口,也有可以拓展出更多网口的QSGMII接口。

这一篇文章就是简单解析一下RGMII这种接口的内容。

RGMII均采用4位数据接口,工作时钟125MHz,并且在上升沿和下降沿同时传输数据,因此传输速率可达1000Mbps。

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

我目前手边上有一个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主题预览文章的问题

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

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

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

1
2
3
4
5
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的配置,修改

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

增加

1
2
3
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';
        }

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

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

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

修改Typecho根目录中的

1
./admin/write-js.php

文件,修改如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
}

主要是这一句话

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

amixer简介

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

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

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

amixer命令格式

使用 amixer命令如下:

1
amixer [-option] [cmd] 

amixer支持的功能

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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查询。

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

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

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

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

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

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

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

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

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

image-20220613165648571

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

1
2
3
/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硬盘的热插拔。

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
插入硬盘:

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

拔出硬盘:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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命令来验证这一问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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,然后网上搜到了一些方法,在这里先简单记录一下。

1
2
3
4
5
CPUID寄存器内容:

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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

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

1
2
Implementer		|Variant	| Architecture	|Part Num	|Revision
0x41 0 f d08 2