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

歌华链路由器刷机历程

一入恩山深似海,从此节操是路人。。。 本文纯属闲扯,用到的方法恩山都有,但没有一个路径完全整合的方法,这里记录一下。

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

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

但由于去年的一个项目用到了内网无线UDP交互,而且对延迟要求很高,也就是键鼠操控的吃鸡的项目。鼠标与键盘连接到电脑,电脑将键鼠消息通过内网UDP封包来发送给iPad,而且键鼠操控的是PS类的游戏,对操控的延时有非常高的要求。

在实际体验过程中,完全暴露了2.4Ghz干扰的存在性。这里的干扰分为两类,一类是来自同一个无线网络中其它通信设备的干扰,二是来自外部2.4Ghz频段的干扰。比如2.4G通信的无线鼠标,2.4G的蓝牙设备,其它2.4G的无线网络的路由器等等。

为了应对这个问题,我起先将2.4G鼠标替换成了罗技的G102有线鼠标,主要是能自定义DIP,目前市场上低DIP的鼠标越来越不好选了,DIP越高,鼠标向上位机汇报的位移信息越多,上位机不需要这么多精确的位移信息,于是进行降采样,以降低鼠标速度,这一步显得多次一举了。直接减低鼠标DIP,可以提高鼠标的响应速度,并且PS类游戏瞄准也可以变简单一些。

另将iPad通过USB连接电脑,将无线网络转换为有线连接,这样一来,整套设备均用有线传输,去除了2.4Ghz的干扰。

最近偶尔刷刷路由器相关论坛,发现如今的路由器集成度已经非常高了,SMB,NAS,迅雷等等常用功能,甚至还有做到集成了家庭网关,语音音响等。

于是顺着论坛垃圾佬们的路子,到闲鱼找了几个配置比较高的路由器,比如友华WR1200JS,歌华链GHL-R-001,处理器和小米Pro是一个型号,前者功放芯片好一点,72一个,后者Ram和Flash大,60一个。友华到手已经刷好Padavan,虽然55有点问题,就不折腾了。

歌华链的没有刷过机,固件版本是1.2.6,恩山上说这个硬件有两个EEPROM版本,刷伪降级固件会因为CheckSUM对不上,导致不能启动。

后来刷论坛总结出一种方法,此方法适用不可降级的1.2.6:

原版固件按住Reset后,会通过TFTP协议到192.168.1.100取一个firmware.bin的固件,以强制更新。通过这种方法可以降级官方固件,然后通过1.21固件自己开的telent端口连上路由器,刷入breed不死,再刷Padavan。

接下来准备好工具以及要刷的固件。

  1. tftp服务器软件:tftpd64
  2. Http服务器软件: HFS
  3. breed
  4. 歌华链1.21固件:1.21固件
  5. Padavan :Padavan

一、降级

只有固件1.21的版本才能利用telent进行刷机,所以需要降级固件版本。

1、首先将本机电脑IP设置为192.168.1.100,网关为192.168.1.1,

2、将1.21固件改名为firmware.bin放置到tftpd64目录下,打开tftpd64软件,选择网络接口为192.168.1.100

3、断开路由器电源,用网线连接电脑和路由器Lan口,用针顶住Reset键,然后插入电源。

4、此时,tftp64上会提示,firmware.bin被下载,然后松开Reset键,等个十来分钟,路由器会自动将固件写进去。

5、这时,路由器貌似会自动重启,你可以用手机搜到歌华链的Wifi名称。

QQ20190716155142

二、刷入Breed

1、降级成功后可以通过网线连接电脑,自动获取到路由器分配的IP。

2、通过telent连接到192.168.9.1 2317端口。如下图所示:

QQ20190716155657

3、用hfs建立简单Http服务器,将breed-mt7621-pbr-m1.bin拖入hfs。

4、wget http://【你的IP地址】/breed-mt7621-pbr-m1.bin

5、mtd write breed-mt7621-pbr-m1.bin Bootloader

QQ20190716160123

三、刷入Padavan

刷入了breed之后就可以对路由器为所欲为了

接下来进入breed,进入breed的方法是,先按住Reset键,然后插电源。

然后电源输入网关地址。

QQ20190716160613

接下来备份自己的eeprom和flash。

刷入Padavan即可。

QQ20190716160646

设计一个简单的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

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

半年来工作内容归纳

总结一下近半年来所做的工作吧,可怜的还需要去实验室网站,拉自己发的周报,才有可能回想起来做了些什么事。游戏伤身还伤心。

从去年国庆节回家后,就没有回庆科实习了,老师也同意在实验室完成一部分公司的实习工作,继续给我发一部分实习工资,以补贴学习期间的囊中羞涩。

实习期间主要做唤醒词的研发,目前来看效果还好,虽然达不到业界水平,有些产品也用上了。

FPGA相关

FPGA是十月份开始正式接触的一直到现在。

起先开始跑了一些官方的简单例程,比如亮个灯,从clk手动计数分频转接到LED,控制频闪。

学习简单的verlog语法和VHDL语法。同样也找了一些所谓的学习视频,但都比较老旧,圈子也比较小。很多涉及到的基础知识多也点到为止,不能透彻的了解其中细节原理。

断断续续折腾了一个月左右,发现入门有很大的困难,国内知识体系太过封闭,接触不到最新的处理器设计相关知识,仍然停留在一些简单的电路设计的层面。

--:--
--:--