一个人的角落,也许并没人会看到这里~~ 祝福你,工作顺心,学习快乐~

黑苹果实现iPhone/iPad快充功能

通常,iphon或iPad连接苹果电脑的USB口时,会使用快充功能,充电功率可以达到2.1A,在[关于本机->系统报告->USB-iPad]中可以看到可用电流为500mA,加上额外的操作电流1600mA,总共2.1A。

然而在MacOS 10.13中USB的电源管理部分,由之前的AppleBusPowerControllerUSB变成了AppleBusPowerController,对应的电源描述属性也有所变化,在tonymacx86.com上RehabMan大佬已经详细阐述了这个问题:

[Guide] USB power property injection for Sierra (and later)

也就是EC的问题。

然而,在我的k610d笔记本上,显示EC被正常识别,AppleBusPowerController也正常加载,USB接上iPad后,额外的所需电流只有900mA,起初没太在意,直到后来把网卡换成BCM943后,额外的所需电流变成了850mA,再到后来接上鼠标后, 额外的操作电流 (mA)变成了650mA,于是不能再忍了。

今天,查看主板USB供电部分,三个接口,左侧USB有一块1.5A限流芯片,右边一个USB3.0和一个USB2.0供电部分直接接到了S5态的19v转5v的DC-DC上,芯片型号为nb671,查看数据手册发现,该芯片持续电流可达6A,峰值电流可达9A,分出2A来充电也是绰绰有余了,不会造成沁硬件损伤。

由于重新修改SSDT-UIACaml中电源电流供应参数,将USB总电流供应由3200ma提升为4100ma,这样在有耗电设备增加时,也不会由于总供电量不足而减少iPad的快充供电。

参考https://www.tonymacx86.com/threads/cant-charge-ipad-using-usb-ports-el-capitan.230465/

阿里YunOS电视盒子中多遥控器兼容实现

Allwinner h3处理器,作为入门级4k解决方案,经过了四五年时间的打磨,使用定制化的系统,目前还是可以运行一些简单的直播类点播类应用,这两天闲着把家里两款H3的积灰了的盒子刷下固件,一个是迪优美特X16,一个是忆典S1,两者均使用的512MB内存,8GB存储的公版设计,使用了阿里的YunOS系统的机器,刷机时只能刷YunOS系统,否则刷机工具会提示 “烧写BOOT1分区失败” ,具体实现机制应该是有芯片设计配合实现。网上有大虾破解这限制,并制作了可以刷入的安卓固件。

h3的机器固件大多可以通刷,只是小部分gpio,包括遥控器等无法正常使用,这里分析其支持多遥控器的实现机制。

涉及到一个内核模块和一个交互程序以及一个按键映射表文件夹。分别是sunxi-ir-rx.ko和/system/bin/multi_ir以及/system/usr/keylayout/custom_ir_xxxx.kl,其源代码分别可在github上找到。

sunxi-ir-rx.ko负责接收红外数据并进行解析。具体外红数据格式为NEC协议,参考:https://www.cnblogs.com/zhugeanran/p/9334289.html

根据遥控器发出的设备地址码和命令码,结合/dev/下注册设备用于与multi_ir交互提供的按键映射,向系统input发送按键消息。通常,设备地址码与遥控器厂商相关,而命令码对应具体物理按键。

而multi_ir用于解析/system/usr/keylayout/中的custom_ir_xxxx.kl。并向sunxi-ir-rx.ko提供不同设备地址的命令码对应的系统按键。其中xxxx为设备地址码。

通过cat /proc/kmsg 可以实时查看sunxi-ir-rx.ko接收到的数据。

sunxi-ir-rx.ko中默认编译可以最大存储16个不同设备地址的映射,因此,文件夹中最多可能存在16个不同的设备地址映射文件。

一例多系统共存下的无陨迁移

四年前买的固态如今不知道什么原因,开机会有一定概率主板检测不到固态,需要多次重启才检测到。

然而最近这种情况概率越来越大了,于是决定换一块三星的,毕竟数据重要。现在的固态价格比起四年前大约降低了一倍多,可能是TLC技术的普及吧。

系统环境

原系统使用了128G固态msata接口+500G机械,都使用的是GPT分区。原来加固态的时候就把机械上的Windows迁移到到固态,顺便把MBR分区转成了GPT,以兼容UEFI启动。

其中固态上为了三个分区,分别为(EFI分区,windows系统区,Ubuntu分区),机械硬盘5个分区,分别为(EFI分区,MacOS分区(原windows所在)以及D,E,F分区)

迁移环境

现在新换的固态为120G,原机械硬盘内容不动。需要将旧固态内容迁移到新固态。

歌华链路由器刷机历程

一入恩山深似海,从此节操是路人。。。

本文纯属闲扯,用到的方法恩山都有,但没有一个路径完全整合的方法,这里记录一下。

实验室的路由器一直用的还是大一买的,当时为便宜走奶茶家一次性买了俩,想着学校小水管D-Link内置天线就够用了,79包邮到一食堂门口。签收完,发现系统着实垃圾,但能用稳定还凑合,接有线一用就是四五年,直到现在9102年了都。

一直用的都是2.4Ghz频段的无线,因为宿舍区墙多隔离效果也好,实际对上网络要求不高,延迟要求不高的应用来讲,2.4Ghz频段的干扰也不大,不像商场比较开旷的地区,对普通应用体验来讲也是感觉不到干扰的。实际上干扰是存在的,主要表现为,当附近有2.4Ghz的大数据量传输时,其它设备会有严重丢包和Ping值变高的影响。

设计一个简单的RiscV协处理器RoCC(数组求和)一

 从系统效率和功能可复性方面来讲,当要使得协处理器能够处理更多的应用情景时,应当将目标事物,拆分成一系列更小的重复通用的事物处理过程,在上层软件中再进行事物处理的组装。而当要使得协处理器以系统效率为主,比如低功耗,则需将系统功能整体设计为一个功能单一的模块,做为专用处理器。

本文叙述一个简单的协处理器设计过程,用以加深对RoCC接口的理解。

RoCC加速器模块是由LazyRoCC类继承而来,该模块包含一个由LazyRoCCModuleImp继承而来的实例。

依葫芦画瓢,我们先设计一个加速器模块的外壳,用以可以被Rocket核调用。


class ArraySumCoP(opcodes: OpcodeSet)(implicit p: Parameters) extends LazyRoCC(opcodes) {
  override lazy val module = new ArraySumCoPImp(this)
}

class ArraySumCoPImp(outer: ArraySumCoP)(implicit p: Parameters) extends LazyRoCCModuleImp(outer)
    with HasCoreParameters {
    val cmd = Queue(io.cmd)
        ...
        ...
        ...
        
}

由于LazyRoCCModuleImp中已经包含了一个RoCCIO的接口,我们可以在实现中直接使用此接口。

RoCCIO接口由多组不同的Wire和bundle组成,具体信息参考上一篇文章:RoCC接口介绍

其中,cmd包含了Custom指令调用时,加速器接收到的内容,参数如下:

  • cmd.inst,为32位指令内容,由以下组成:cmd.inst.[opcode, rd, rs1, rs2, funct, xd, xs1, xs2
  • cmd.rs1,为源寄存器1内容
  • cmd.rs2, 为源寄存器2内容

此外,LazyRoCC类包含了两个TLOutputNode实例: atlNodetlNode,分别通过Tilelink总线的方式连接到L1缓存,和L2缓存

mem实例用于直接访问L1 Cache缓存,ptw直接访问页表,busy信号指明加速器是否正在处理指令以及一个中断信号。

本次,我们使用mem接口来实现对内存数据的访问和存储。

求最小连通图或树的最短遍历路程

题目描述

给定一张包含N个点、N-1条边的无向连通图,节点从1到N编号,每条边的长度均为1。从1号节点出发并打算遍历所有节点,那么总路程至少是多少?

输入

第一行包含一个整数N,1<=N<=10^5

接下来N-1行,每行包含两个整数X和Y,表于X号节点和Y号节点之间有一条边,1<=X,Y<=N。

输出

输出总路程的最小值。

样例输入

4
1 2
1 3
3 4

样例输出

4

解题思路:

从题目描述来看姑且可以将题目输入看做是树,以根节点开始遍历,计算总路程。

关键在于如何判断最短路径。分析可知,除最后一个遍历的叶子节点到根节点的弧只需走一遍外,其它所有弧都要走两遍。

因此,只需要计算出树的深度为D。

结果为 :

[N-1)*2 - (D-1)


编码待续。

RiscV-RoCC(RiscV协处理器, Rocket Custom Coprocessor) 介绍

RiscV作为一个新的开源指令集架构,由Aspire Lab开放,具有简单开放的特点,主要用于教育研究.

一个最主要的特点是其ISA通过支持自定义指令的方式,支持自定义硬件加速器,用于专用领域的计算加速设计。

本文简单介绍RiscV的RoCC,以及其与RiscV处理器核通信的接口RoCC Interface。

RiscV自定义指令

RiscV ISA定义了四种自定义指令用于与协处理器进行交互。

customX rd, rs1, rs2, funct

标准自定义指令格式如下:

Screenshot from 2019-04-08 21-07-00

其中rs1,rs2 为源寄存器,rd为目的寄存器,xd,xs1,xs2为寄存器有效位,分别指明rd,rs1,rs2是否已使用。

opcode为四种不同的custom指令(custom-0/1/2/3/)

在arty a7-35t FPGA开发板上运行Sifive开源RiscV处理器简单指导

要在FPGA开发板上调通RiscV主要需要两方面知识,一方面是简单的电子电路知识,二是软件层工具链和嵌入式开发知识。

在ARTY 35T FPGA开发板上运行RiscV还需要一个支持RiscV处理器核的JTag调试器,用于调试和下载程序。 官方使用的是Olimex ARM-USB-TINY-H。

主要流程分为三个部分:

  1. 生成用于烧录到FPGA开发板上包含整个RiscV Soc的mcs文件
  2. 安装RiscV gcc工具链,生成并上传软件代码程序。
  3. 调试和测试软件程序

运行环境 整个过程使用Ubuntu 16.04完成,并且建议使用实体机器运行,100g以上硬盘空间,原因主要有几点:

  1. 生成Sifive fe310处理器需要用到linux环境。
  2. vivado 目前只支持Ubuntu1604而且是较老的Ubuntu1604.3
  3. 减小USB插拔转换不必要的麻烦。
  4. 运行效率和GUI体验。

一、安装和下载必要的软件

在开始之前需要准备好以下软件。

  1. vivado HLx –> 用于生成arty的mcs文件和fpga烧写 大小17G左右 https://www.xilinx.com/support/download.html

  2. sifive/freedom –> Github RiscV SoC 源代码

  3. sifive/freedom-e-sdk –> Github Sifive提供的软件开发SDK 代码

  4. 预编译gcc工具链和riscv OpenOCD –> 由Sifive官方网站Tools提供。

    https://www.sifive.com/boards/

  5. Digilent/vivado-boards –> Github vivado arty开发板文件

  6. Adept 2 –> Arty FPGA开发板驱动

    https://reference.digilentinc.com/reference/software/adept/start

下载和安装可以同时进行以节约时间