ThinkNotes

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

0%

本文描述:如何参与到Linux kernel社区中,为Linux kernel提交Patch代码;以Linux子系统MMC/SD为例介绍如何使用patch。

Linux kernel提交代码的基本概念

如何参与Linux内核开发

Linux kernel的官方网站:kernel.org

kernel.org内的中文文档:如何参与Linux内核开发, 其中最常用的:

如何提交Patch

Patch是提交到kernel之前的一个阶段,由kernel subsystem maintainer review后有机会进入Linux kernel Mainline。事实上绝大所述patch最终未进入Linux kernel Mainline,仅存档到了邮件列表,在lore/patchwork.kernel.org可查看这部分patch的内容和提交过程。

示例:Linux MMC子系统中UHS-II Patch的演化过程

阅读全文 »

本文PLL的基础内容参考了Digital Integrated Circuits一书,下载方式:在 vdoc 搜索关键字 Digital Integrated Circuits

img

PLL的应用概述

两个作用:Clock Synthesis(时钟综合)和 Clock Synchronization(时钟同步)

  • Clock Synthesis,Synthesis是综合/生成的意思,Clock Synthesis即生成时钟,但此处含义不是作为时钟源,而是在低频晶振时钟的基础上倍频生成高频时钟:其中低频的晶振时钟的特性:10~200MHz, accurate, low-jitter ,高频时钟特性:200MHz ~ GHz级别,通常也称为系统时钟,例如SOC core的基准频率
  • Clock Synchronization,不同芯片之间传递时钟信号需要同步时钟相位,例如SOC的CPU和外设之间的通信接口一般是:分频后的时钟信号(reference clock)和数据信号(Date),CPU和外设间的信号传递是需要时间的,高速信号传递到外设侧有相位偏移(可以简单理解为延迟),因此需要PLL同步时钟相位以保证对数据采样的正确性(想象一下,如果reference clock相位偏移过大,可能每个采样时刻得到的data数据都是错位的)

image-20230303104354744

相位的概念

Digital Integrated Circuits一书对相位的描述:

Periodic signals of known frequency can be discribed exactly by only one parameter, their
phase. More accurately a set of two or more periodic signals of the same frequency can be
well defined if we know one of them and its phase with respect to the other signals.

翻译下就是:

阅读全文 »

SSH配置

SSH基本概念

  • SSH是Secure Shell缩写,实现安全远程登录

​ SSH的安全性好,原因是其对数据进行加密,方式主要有两种:对称加密(密钥加密)和非对称加密(公钥加密)
​ 对称加密指加密解密使用的是同一套秘钥。Client端把密钥加密后发送给Server端,Server用同一套密钥解密。对称加密的加密强度比较高,很难破解。但是如果有一个Client端的密钥泄漏,那么整个系统的安全性就存在严重的漏洞。
​ 为了解决对称加密的漏洞,于是就产生了非对称加密。
​ 非对称加密有两个密钥:“公钥”和“私钥”。公钥加密后的密文,只能通过对应的私钥进行解密。想从公钥推理出私钥几乎不可能,所以非对称加密的安全性比较高。

  • SSH的加密原理中,使用了RSA非对称加密算法。

​ 整个过程:

​ (1)远程主机收到用户的登录请求,把自己的公钥发给用户。

​ (2)用户使用这个公钥,将登录密码加密后,发送回来。

​ (3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

  • 关于中间人攻击(Man-in-the-middle attack)
阅读全文 »

Samba基本概念

Samba是SMB protocol的应用程序实现,分为服务端和客户端;

Samba通常的使用场景:在同一局域网内的的Linux主机安装Samba服务,windows主机可以访问Linux Samba服务指定的共享目录。

在嵌入式开发中通常在windows 上编辑Samba共享目录下的代码,通过 Linux环境编译代码,而无需在两个主机间拷贝代码文件。

Ubuntu安装Samba服务

Ubuntu 20.04和22.04 版本,安装Samba服务参考:

www.how2shout.com/linux/how-to-install-samba-on-ubuntu-22-04-lts-jammy-linux
主要流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#install and run samba service
sudo apt install samba -y

#enable auto start samba service
sudo systemctl enable --now smbd

#firewall allow samba
sudo ufw allow samba

#add system user to sambashare group
sudo usermod -aG sambashare $USER

#set passwd for sambashare
sudo smbpasswd -a $USER

#check samba service is running
systemctl status smbd

#share the folder in ubuntu GUI checkbox
右键要共享的home文件夹properties -> local Network Share -> share this folder ->share name不能直接用用户名,可以用'用户名+Home'

显示无权共享:非root用户要共享/home,需要修改smb.conf:

1
2
3
sudo vim /etc/samba/smb.conf
在[global]新增usershare owner only = false
sudo systemctl restart smbd
阅读全文 »

Tree命令生成目录树

tree 命令的目录格式:TREE 【drive:】【path】【/F】【/A】

  • 可在cmd内输入(help tree 或 tree / ?)查看
  • /F 显示每个文件夹中文件的名称
  • /A 使用ASCII字符,而不使用拓展字符

示例一:只显示路径名不显示文件名

TREE 【drive:】【path】

image-20230130104934713

示例二:显示路径名和文件名

TREE 【drive:】【path】【/F】

image-20230130104835813

示例三:将目录树存入指定文件

TREE 【drive:】【path】 > 文件路径】

阅读全文 »

VSCode配置笔记

修改工作区存储目录

VSCode会将每个工作区的一些配置、扩展、缓存等默认保存在C盘的AppData\Code\workspaceStorage,使用一段时间后数据能达到上十GB。

当C盘空间不足,用SpaceSniffer可以找到这些“数据垃圾”,但每隔一段时间清理也不是一劳永逸。

修改workspaceStorage存储路径到非系统盘:

1.首先选择VSCode在开始栏,状态栏,或桌面栏的快捷方式图标,常用哪个就修改哪个,右键属性:

添加启动的命令行选项,指定user-data-dir:

1
--user-data-dir "目标路径,例如F:\VSCodeWorkspaceStorage"

image-20221208120051137

2.转移已有的workspaceStorage.

阅读全文 »

本文基于Qt官方示例 A Quick Start to Qt Designer, 实现自定义的slot函数,新增RGB色彩窗口显示色彩。

本文只记录项目过程中的注意事项,以及增量开发,其他部分参考Qt官方示例。

1.UI部分

  • 建立带UI的项目rgbSlider, 基于Qwidget生成默认自定义类名widget
  • 双击widget.ui进入UI编辑

UI 编辑模式下使用两种模式:widget编辑模式, slot/signal编辑模式

  1. widget编辑模式如下:使用水平、网格布局
    RGB数值控制部分,使用Label, spinBox和scrollBar三种控件,按先竖直,后水平排列
    RGB颜色显示部分,使用 graphicsView窗口

    注意调整布局的比例需要先选中,然后在layout属性调整

  2. slot/signal编辑模式
    直接拖拽起始控件和目标控件,设置控件的信号和槽

2.自定义槽

graphicsView窗口预期效果是:只要调整RGB数值,自动显示对应的颜色
UI界面不能设置控件信号触发自定义槽,需要在代码中实现信号和槽的连接。

  1. 右键转到graphicsView窗口的槽函数,自定义为 Widget::on_rgbChanged()

    函数实现如下:
阅读全文 »

1. Linux MMC 框架现状

Linux MMC driver是支持包括SD卡,eMMC卡等等,属于MultiMediaCard设备和接口的驱动
其源码路径位于Kernel source code的drivers/mmc路径, 头文件位于include/linux/mmc
mmc源码分为core/host两层,是为了解耦:

  • 通用的SD/eMMC流程(core)
  • 具体的硬件操作流程(host),在此层又可分为通用的SDHCI框架和非SDHCI框架,各eMMC/SD host厂商实现最底层driver时,可以遵循SDHCI框架下的API, 间接实现core层定义的方法(driver称为operations), 也可以不遵循SDHCI框架,直接实现core层定义的方法。

本文重点关注mmc框架对SD卡驱动的支持

1.1 SD卡的类型概述

SD卡可以分为三种类型:
UHS-I, UHS-II, SD express

详细信息参考https://www.sdcard.org

  • Physical Layer Specification Ver.7.10 (从各层描述SD 7.0, SD 4.0, 以及更早版本SD的规范)
  • SD Host Controller Specification Ver7.0 (从host控制器角度,描述SD 7.0, SD 4.0, 以及更早版本SD的规范)
  • SD_Specifications_Part_1_UHS_II_Addendum(描述SD UHSII的附录规范)

UHS即Ultra High Speed, express也表示高速,这三代SD卡的读写速度是依次增加,参考下图:

  • UHSI:50~104MB/s
  • UHSII: 156~624MB/s
  • SD express: 985MB/s
阅读全文 »

Python使用正则表达式示例

Python的正则表达式比较全面的教程,参考# Python RegEx

使用背景:芯片ATE测试中,不同ATE平台的测试模式文件格式有不同,需要匹配字符串并按特定转换
转换前:

Pattern “pll_dll_100m_test” {
waveform_start:
W pll_dll_100m_wft;

//Enter PLL/DLL Mode
V {pll_dll_100m_group = 0 0 1 0 0 1 1 0 X X ;}
V {pll_dll_100m_group = 0 1 1 0 0 1 1 0 X X ;}
V {pll_dll_100m_group = 0 0 1 0 0 1 1 0 X X ;}

转后后:

//Enter PLL/DLL Mode
V {pll_dll_100m_group = 0 0 1 0 0 1 1 0 X X ;} W pll_dll_100m_wft;
V {pll_dll_100m_group = 0 1 1 0 0 1 1 0 X X ;}

规则:将以“W_xxx”的字符串放到下一个以“V_xxx”的字符串后面

利用python正则匹配,配合读取文件到字符串数组,实现如下转换:

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
37
38
39
40
41
import os.path
import re

infile_name = input("Please input the name of file in current directory to convert: ")
name_flag = infile_name.find('.')
if name_flag == -1:
print("file name error, need input the suffix of file name")
input("Please press Enter key to exit")
exit(0)
else:
if os.path.isfile(infile_name):
outfile_name = infile_name[0:name_flag] + "_updated" + infile_name[name_flag:]
else:
print("no such file!")
input("Please press Enter key to exit")
exit(0)

infile = open(infile_name, "r",encoding='utf-8')
outfile = open(outfile_name, "w",encoding='utf-8')

lines = infile.readlines()
infile.close()
flag = 0

for index in range(len(lines)):
str_obj = re.match('[\s]*W[\s].*', lines[index]) #match the "W ..."
if str_obj != None:
flag = 1
temp_index = index
temp_str = str_obj.group()
else:
str_obj = re.match('[\s]*V[\s].*', lines[index]) #match the "V ..."
if str_obj != None:
if flag == 1:
lines[temp_index] = '\n' #clear last "W ..."
lines[index] = str_obj.group() + ' ' + temp_str + '\n' #add the "W ..." from "V ..." end
flag = 0
outfile.writelines(lines)
outfile.close()
print("outputfile is " + outfile_name)
input("Please press Enter key to exit")

这里的W和V前面加了额外的匹配项:[\s]*,是因为文件存在不可见的回车换行等引起,如果不加匹配不到

阅读全文 »