Yuhang Zheng
未来的礼物

你总是期望什么事情来带来改变,而那个事情却迟迟未来,说好了顺其自然,但是又是什么原因让自己焦躁不安?

就像是炸弹上的倒计时的滴滴声,无时无刻不萦绕耳边挥之不去,让人坐立不安。

是谁在催促自己,还是自己给自己定下的时间界限?为什么要这么着急呢?或者,为什么这个事情就一定是必须要完成的呢?

如果假设一个最坏的结果并且接受它不好么?这样生活就再也没有那个事情的困扰,那所有的事情也不会变得更坏,生活就可以在好好计划中再被重新安排。

想逃离,却逃离不去,想挣脱,却被紧紧包裹,仿佛那个事情就是全部的意义,而我现在要做的是将那个意义从我生命中剥离,为什么,变成了这个样子呢?

我最终还是活在了别人的期望里,想要完美的样子,却把自己搞得一团乱麻。既然一切都有最好的安排,那也许是上天依然觉得我还没有准备好么?还无法迎接那个事情的到来,也没有能力来引导另一个灵魂来享受这个世界的旅程,也许是这样的吧。

在无法处理自己的情绪之前,在无法管理自己的期望之前,在无法解决要在现实中的争取和妥协之前,在无法好好的在无序的混乱中快速清醒之前,上天明白到底什么时候你才能接得住这个沉甸甸的礼物,与其早早的交付到自己手中并毁掉它,还不如等待更长的时间留给经历过挣扎之后不再迷失的自己。毕竟是那么沉重,那么沉重的恩赐,如何也要更小心一点才对呢。

你期望那个事情来给你带来成长和生活中的改变,却不知也许它也在焦急的等待着一个更成熟更可靠和更稳重的自己能让它安心的到来,是时间未到对么?或许是自己才应该是好好的努力不让它等待的太久失望的离开。

不要再像一个小孩子一样幼稚,也不要再轻浮的口无遮拦,做一个更成熟和自律的自己才对么?想要进入大人的世界,像一个孩子还怎么能行呢?也许只有当自己真正的能够享受生活的时候,能够好好的管理自己的时候,才是真正它真正想要到来的时候。

IC卡扇区解读

介绍

每张IC卡都有16个扇区,包括1个公共区和15个数据区。每个扇区有4个块,每个块占16字节。

第0扇区的块0为厂商代码,已经固化。包括芯片序列号UID,ATQA和SAK

每个扇区的块3为控制块,用来存放密码和控制权限 ,不能用来存储数据。

每个扇区的块0,块1,块2可以用来存储数据(扇区0的块0除外)。

块3的前6个字节为KeyA,后6个字节为KeyB。中间的4个字节为存储控制。

每个扇区可以通过它包含的密钥A或者密钥B单独加密

扇区图

在这里插入图片描述

IC卡加解密

非加密卡和加密卡的区别就是,非加密卡中所有扇区的KEYA和KEYB数值都是默认值FFFFFFFFFFFF;而加密卡中,其中有扇区的KEYA和KEYB不等于FFFFFFFFFFFF,部分扇区加密的卡称半加密卡,所有扇区都加密的卡称全加密卡
在这里插入图片描述

ubuntu更新错误

ubuntu更新报错如下:

root@localhost:~# apt-get update
Err:1 http://us.ports.ubuntu.com/ubuntu-ports bionic InRelease
  Temporary failure resolving 'us.ports.ubuntu.com'
Err:2 http://ports.ubuntu.com/ubuntu-ports bionic-security InRelease
  Temporary failure resolving 'ports.ubuntu.com'
Err:3 http://ppa.launchpad.net/ondrej/php/ubuntu bionic InRelease
  Temporary failure resolving 'ppa.launchpad.net'
Err:4 http://us.ports.ubuntu.com/ubuntu-ports bionic-updates InRelease
  Temporary failure resolving 'us.ports.ubuntu.com'
Reading package lists... Done
W: Failed to fetch http://us.ports.ubuntu.com/ubuntu-ports/dists/bionic/InRelease  Temporary failure resolving 'us.ports.ubuntu.com'
W: Failed to fetch http://us.ports.ubuntu.com/ubuntu-ports/dists/bionic-updates/InRelease  Temporary failure resolving 'us.ports.ubuntu.com'
W: Failed to fetch http://ports.ubuntu.com/ubuntu-ports/dists/bionic-security/InRelease  Temporary failure resolving 'ports.ubuntu.com'
W: Failed to fetch http://ppa.launchpad.net/ondrej/php/ubuntu/dists/bionic/InRelease  Temporary failure resolving 'ppa.launchpad.net'
W: Some index files failed to download. They have been ignored, or old ones used instead.

原因是dns没有配置,解决办法 加入dns服务器地址:

vi /etc/resolv.conf

添加

nameserver 202.96.134.133
nameserver 8.8.8.8

如果提示只读,用sudo运行,即:

sudo vi /etc/resolv.conf

运行完重启系统解决

偶感

雪莲的纯洁在于它选择绽放在了荒无人际的冰域,以自己独一的冷漠与清高向人们诠释了何谓真正的纯洁。其实,我终于明白,所谓的纯洁其实是需要极大的勇气,甘心并且坚持拒绝繁华,拒绝任何可能玷污心灵的向往。

任何繁华的指向都是虚无,因为世界上没有什么可以永远鲜艳的存在,极致背后总会是失落的痛苦。所以告诉自己,要淡化所有的追逐。可以有生活的梦想,但不要让自我成为梦想的附属。我只求每天都是自己,每天都能感受到自我的存在,心的跳动与永不枯竭的泪湖。

我时时告诉自己,要懂得区分幻想与现实。我知道,没有什么可以永远存在于自己的世界里,自己所遇到的,所了解的,所熟知的,终究会成为陌生的东西。所有的色彩都经不起时间的冲刷,所有的一切都会成为记忆的琥珀,尘封在已过往的岁月流年里。

现实中我更喜欢用幻想编制虚无的美丽,看那绽放在记忆中绚丽的七彩。然而,我会知道。无论自己有多么喜欢,那依旧是幻影,终会随时间减淡。无论是什么,我会喜欢,但绝不会迷恋。我会很清醒的知道,不会妄想将幻想带进现实的世界里。而我,也必须要为现实做出某种努力,比如说:学习。

我想,现在的自己已经达到了理想中的状态。所以,自己应该感觉到平和与幸福。

自己已经很好了,卓绝的认知与无悔的坚守。这些都让自己很好的成长。所以我不想再改变什么,也不想再接触其他的神秘。我只求永远保持这种感觉到生命的尽头。

任何时候都不要妄想用满足了结自己的向往。一个人的向往与追逐是一个填不满的无底洞。其实,我们都不知道自己想要的最终是什么,仅仅是靠一个名为梦想的东西指引着不断前行。我们的目的到底在哪里?难道人生注定只是一个漫游?有时候,真的真的不要轻易满足自己,不断满足背后是更为辛苦煎熬的追逐。人性对繁华的贪恋,真的好可怕,有时候,连自己的意志都克制不了……

自己拒绝自己想要的,这是一种多么残酷的本领,因为世人都习惯放纵,很少有人愿意与自己斗争,编造种种可悲的理由来为自己的堕落寻找借口,以侥幸的想法来为自己开脱责任。

人的价值,在遭遇诱惑的一瞬间被决定。

OpenWRT系统定制方法

OpenWRT的SDK是一套全自动的编译框架,其中是不包含编译需要的源码的。

以OK1046A-C OpenWRT开发为例

编译步骤为:

tar xvf openwrt_ok1046_v1.0.tar.bz2
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
cp ok1046_defconfig .config
make -j4

编译完成后内核及设备树位于:

build_dir/target-aarch64_generic_musl/linux-layerscape_armv8_64b/linux-4.9.63/arch/arm64/boot/Image

build_dir/target-aarch64_generic_musl/linux-layerscape_armv8_64b/linux-4.9.63/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb-sdk-1040-5559.dtb

build_dir/target-aarch64_generic_musl/linux-layerscape_armv8_64b/linux-4.9.63/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb-sdk-1133-5559.dtb

文件系统位于:

staging_dir/target-aarch64_generic_musl/root-layerscape
LS10XX系列添加对华为ME909s模块的支持

华为ME909s的4G模块是一个PCIE接口的USB协议的4G模块,它会通过USB口拓展出4路串口,分别为/dev/ttyUSB0,/dev/ttyUSB1,/dev/ttyUSB2,/dev/ttyUSB3。

然后用户可以通过echo “ATE0” > /dev/ttyUSB2命令来向4G模块发送AT指令。

此外,此模块还会通过USB协议注册一个网络设备节点:wwan0

以LS10XX为例,如果想要使板卡支持该模块的话,首先先连接4G模块,使用lsusb命令查看一下硬件连接是否正常:

lsroot@localhost:~# lsusb
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 002: ID 12d1:15c1 Huawei Technologies Co., Ltd.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

如上所示,ID 12d1:15c1 Huawei Technologies Co., Ltd.为接入的4G模块设备,其中12d1为厂家ID,15c1为产品ID。

接下来我们需要检查内核配置。

首先检查内核配置文件:

arch/arm64/configs/ls1012_defconfig
LS1012的网络初始化解析

简单梳理一下LS1012开发板的Uboot阶段网络初始化过程

在文件:

OK10xx-linux-fs/flexbuild/packages/firmware/u-boot/include/net/pfe_eth/pfe_eth.h

首先定义了我们所需要的三个结构体:

struct gemac_s {
        void *gemac_base;
        void *egpi_base;

        /* GEMAC config */
        int gemac_mode;
        int gemac_speed;
        int gemac_duplex;
        int flags;
        /* phy iface */
        int phy_address;
        int phy_mode;
        struct mii_dev *bus;

};

struct pfe_mdio_info {
        void *reg_base;
        char *name;
};

struct pfe_eth_dev {
        int gemac_port;
        struct gemac_s *gem;
        struct pfe_ddr_address pfe_addr;
        struct udevice *dev;
#ifdef CONFIG_PHYLIB
        struct phy_device *phydev;
#endif
};
信号dB值的意思

说明:

手机信号值是越大越好,也就是-60db比-70db信号好。这个值越大信号就越好,因为那是个负值,而且在你手里的时候它永远是负值,如果你感兴趣且附近有无线基站的天线的话,你也可以把你的手机尽量接近天线面板,那么值就越来越大;如果手机跟天线面板挨到一起,那么它可能十分接近于 0了(0是达不到的,这里的0的意思也不是说手机没信号了)。
在无线路由中,db同样是越大越好,也就是9db比5db信号好,发射端一般是正值,数值越大发射功率越大;接收端一般是负值,数值越小代表灵敏度越高。
这两者没有必然的关联。

总结:

对于信号接收端,此值为负值,这个值越大信号就越好,也就是-60db比-70db信号好。

对于信号发送端,此值为正值,同样是越大越好,也就是9db比5db信号好

新世界的拓荒

想了很久终于要写下文字,在这么一个全新的地方,是最开放也是最私密的小世界里。在偌大的无法想象的互联网上的一个最不为人所知的小角落里。

之前看了很多大佬的搭建的个人博客,很温馨,很精致,很羡慕。在一个属于自己的地方记录着生活,分享着知识和成长,和志同道合的小伙伴们一起创造着属于他们一起的回忆。

大概是他们是很认真很专注的那种人吧,主动拥抱着热爱的生活,为了兴趣愿意付出时间并且欣然去努力。能够致力于长期的投入等待未来的回报,能够乐在其中过程而不是迷失在对结果的渴求中,这些品质就是现在的自己很想很想要的吧。

也不必在这里反思自己的状态,不必过分去内疚曾经的自己,真正重要的还是要去决心改变这一切令你不满意的现状,让曾经的过去,让未来的到来。

希望从现在开始,有一个新的启程吧,认真去对待这个地方,认真记录和分享。只有变成更好的人,才能遇到更好的人,才能与那些现在自己眼中的大佬站在同样的水平上侃侃而谈。

愿改变,从此刻开始。

完成量(转载)

在驱动程序开发中,一种常见的情况是:一个线程需要等待另一个线程执行完某个操作后,才能继续执行。这个工作其实信号量也可以完成,但其效率比Linux中专门针对这种情况的完成量机制要差些。

一、完成量概述

Linux中提供了一种机制,实现一个线程发送一个信号通知另一个线程开始完成某个任务,这种机制就是完成量。完成量的目的是告诉一个线程某个事件已经发生,可以在此事件基础上做你想做的另一个事件了。

二、定义

完成量由struct completion结构体表示
定义于#include<linux/complete.h>

struct completion {
unsigned int done;
wait_queue_head_t wait;
};

done 成员
done成员用来维护一个计数。当初始化一个完成量时,done成员被初始化为0。由done的类型可以知道这是一个无符号类型,其值永远大于等于0.当done等于0时,会将拥有完成量的线程置于等待状态;当done的值大于0时,表示等待完成量的函数可以立刻执行,而不需要等待。

wait成员
wait是一个等待队列的链表头,这个链表将所有等待该完成量的进程组成一个链表结构。在这个链表中,存放了正在睡眠的进程链表。