Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明

news2024/9/23 17:25:12

目录

  • Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明
  • Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改
  • Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfs
  • Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs

介绍

恩兔N2是一个家庭存储的系列产品, NS-1 是其中体积最小的一个型号, 基于海思ARM64 CPU Hi3798MV200. 和其他设备相比, 特点是内置2.5寸SATA盘位, 并且带千兆网口. 这个设备比较小众, 存量很小, 不如斐讯N1, 玩客云那样有广泛的认知度, 甚至在百度和Google上搜索都没什么结果. 生产商恩兔科技这个公司已经停止经营, 其网站 n2yun.com 也已经无法访问. 因为有海思 Hi3798 系列内核的SDK和刷机工具, 使得这个盒子可以注入新的灵魂, 发挥余热, 物尽其用.

本文的内容, 大量参考自以下链接

  • 带图说明 https://www.wdmomo.fun:81/doc/index.html?file=003_%E5%90%84%E7%B1%BB%E7%9F%BF%E6%B8%A3/013_%E6%81%A9%E5%85%94NS-1
  • 刷机说明 https://github.com/xiayang0521/n2ns-1/
  • HiNAS https://www.ecoo.top/hitool.html

实物图

包装

正面

正面是一个带指示灯的按钮, 和三个指示灯. 这四个指示灯都是红绿双色, 可以用红绿橙三色显示状态

背面

背面包含一个用于供电的 USB Type-C 口, 一个 HDMI 口, 一个千兆网口, 一个USB口和一个SD Card卡槽.

内部

螺丝在包装的塑料袋里, 盒子默认没上螺丝, 用指甲沿两边可以轻松撬开. 内部可以看到一个标准的2.5寸SATA盘位. 这个高度可以放7mm和9mm厚度的硬盘, 不确定是否能放更厚的15mm厚盘.

PCB特写

正面和背面

TTL 接口

硬件配置

PartSpecsNotes
CPUHi3798MV200四核A53, T450 GPU, 详细型号为 Hi3798MRBCV2010D000 详细信息
RAMDDR4 1GBK4A4G165WE-BCRC * 2, 单颗256M 16b, 最高支持ddr2400
FlasheMMC 4GB东芝THGBMDG5D1LBAIT
Ethernet10/100/1000M * 1Realtek RTL8211
USB 2.0USB 2.0 * 1
HDMIHDMI 2.0 * 1
HDDSATA 3.0 * 12.5 Inch
Power SupplyDC 5V 2AUSB-TypeC
Other InterfacesSD Card Reader * 1

刷机前的准备工作

硬件部分

  • 一台正常工作的, 运行Win10的电脑
  • 网线, 用于连接 N2NS1 到交换机或路由器
  • 用于USB转串口, USB2TTL的串口模块, 常见的 CH340 模块即可

软件部分

软件部分主要是刷机工具和固件

刷机工具

刷机工具是基于 Eclipse 框架开发的, Windows版下载地址列表

  • https://oss.histb.com/HiTool-windows.7z
  • http://xz.w10a.com/small/HiTool.7z
  • https://dl.ecoo.top/HiTool-soft/HiTool-windows.7z
  • https://www.xitongzhijia.net/soft/211748.html
  • http://www.hihope.org/en/download/download.aspx?mtt=36 需要注册

Linux的版本比较旧, 未尝试使用

  • https://oss.histb.com/hitool_linux.tar.gz
  • https://dl.ecoo.top/HiTool-soft/hitool_linux.tar.gz

固件

常见固件的下载

  • HiNAS https://dl.ecoo.top/
    这是一个功能比较完整的集成系统, 内核4.4.35, 选择恩兔N2 NS1定制的 TTL-hi3798mv200-202307-64-n2ns1.zip
  • Debian https://pan.baidu.com/s/1Dx58Zc43P3b3cx3tnhLlmw?pwd=9qte
    这是我基于4.4.35内核做的Debian10系统, 比较干净的版本, 未安装各种服务软件
  • 合集 https://github.com/xiayang0521/n2ns-1/releases
    这里包含了稍息版的 Debian 10, 以及 Centos7 等系统的固件

备份和刷机

海思烧录的基本原理(摘抄自帮助手册)

HiBurn工具在开始烧写后,

  1. 首先与bootrom进行交互, 工具将 DDR 参数传送到传到bootrom, 即为uboot下载阶段5%处, 然后初始化DDR
  2. 把uboot传输到DDR中, uboot下载阶段100%处表示传输完毕
  3. 从DDR启动uboot
  4. uboot启动完成后, 工具开始与uboot进行交互, 发送烧写命令, 将DDR中的uboot烧写到Flash对应地址中

uboot部分是通过TTL传输, 其他镜像分区烧写, 如kernel, rootfs等分区, 工具默认采用网口传输的方式, 客户可选择裸烧和非裸烧两种方式进行烧写

  • 裸烧即为在按分区烧写或按Emmc烧写中勾选uboot进行烧写,此时uboot会被烧写到Flash中
  • 非裸烧即为不勾选uboot, 仅勾选其他分区进行烧写, 此时需要保证当前单板上已经存在uboot, 烧写时工具会启动uboot, 与其交互, 通过向uboot发送TFTP命令与Write命令, 完成烧写.

准备工作

准备 TTL2USB, 排针和网线, 主板上的四孔接口为 TTL, 接口定义参考前面的图.

方孔为VCC不连接, 工作时测得电压为3.3V, 因此切勿用5V的电压连接, 平时最好不连接. USB转串口模块连接电脑和盒子, USB转串口模块的 RX 接盒子的 TX, TX 接盒子的 RX.

本机(上位机)打开 HiTool, 芯片选择 Hi3798MV200, 点击运行 HiBurn, 点击刷新, 本机会自动识别IP和存在的串口, 将串口修改为USB2TTL所在的串口, 盒子(下位机)的IP和本机IP要在同一网段, 例如本机为 192.168.9.123, 板子的IP就可以设为 192.168.9.100, 不要和网段中其它机器冲突即可. 传输方式选择网口.

MAC 地址可以自行设置, 软件将根据设置在刷机过程中使用该 MAC 地址作为板端 MAC

备份

准备分区表

盒子先上电启动一次, 通过串口 TTL 软件看启动日志, 或者在命令行中查看dmesg, 可以得到当前的分区信息, 其格式为

blkdevparts=mmcblk0:2M(fastboot),1M(bootargs),4M(deviceinfo),6M(stbinfo),8M(baseparam),20M(logo),8M(pqparam),40M(private),10M(privatebak),80M(factory),40M(trustedcore_linux),80M(kernel0),80M(kernel1),150M(root0),150M(root1),300M(roothome),-(userdata)

根据上述信息在分区部分逐个添加分区, 最后选择保存分区表.

除了大小, 分区类型在首次备份可以全部选择 none, 也就是以 raw 方式备份, 备份完成后用 binwalk 等工具测试分区到底是 raw 还是 ext4, squash. 除了 roothome 和 userdata, 其它全是raw, 也就是none. 都使用raw类型对备份无影响.

执行备份

分区表选择刚才设置保存的路径, 然后逐个选择文件路径(备份的目标文件名, 主机上目前没有)

programmer 文件为刷机模式使用的临时 fastboot, 可以从别的固件提取, 也可以通过 TFTP 手动备份, 如果留空则使用 eMMC 内置的, 这种情况要求 eMMC 中有 UBOOT, 否则备份失败.

选择上载, 按照提示给盒子上电, 备份需要大约20分钟.

刷机

准备分区表和刷机文件

  1. 解压需要刷机的固件
  2. 运行 HiTool, 在启动对话框选择正确的芯片型号, 选择默认的按分区烧录
  3. 在 partition file 那一行点击浏览, 选择对应的分区表文件. 此时 HiTool 会显示定义好的分区列表, 对应的大小和文件
  4. 在列表中, 勾选的部分是会被执行操作的, 要备份/擦写/写入哪个部分, 就勾上哪个部分

这里以 Debian 固件下载链接 为例进行说明, 其分区表文件为 partition_debian.xml, 对应的六个分区分别是

  1. fastboot(UBOOT)
  2. bootargs(启动参数)
  3. stock_kernel(recovery内核, 小内核)
  4. stock_squash(recovery系统, 小系统)
  5. kernel(64位目标内核)
  6. rootfs(64位目标系统)

通过 HiTool 写入

点击烧写/Burn按钮后, 根据日志窗口提示断电然后上电, 工具会检测到盒子状态, 自动开始烧录

日志窗口会显示进度, 等待烧写完毕后会自动reset, 时间大概需要五六分钟

Debian系统的使用

  • 通过TTL终端软件在串口可以直接登录, 也可以在路由器中查到盒子的IP后, 通过SSH登录.
  • 默认用户为 root / root
  • 刚刷完的根目录所在分区, 可用空间为0, 登录后执行 local-resize.sh 对分区进行扩容.

通过 Recovery 模式恢复或刷机

在固件的6个分区中, stock_kernel 和 stock_squash 组成了一套可以独立运行的 recovery 系统, 如果要让盒子启动进入 recovery 系统, 只需要修改 bootargs 分区.

在 HiTool 中仅勾选 bootargs, 将对应的文件改为 bootargs_stock 进行烧录, 重启后就会通过 stock_kernel / stock_squash 启动, 进入 recovery 命令行

进入 recovery 命令行, 登录用户 root, 密码为空

  • 选项一: 机器连接串口, 通过串口操作
  • 选项二: 机器连接网线, 在路由器找到设备IP, telnet连接

以稍息版的 Debian 刷机包为例说明如何写入系统.

  1. 将 stretch.tar.bz2 和 bootargs2 文件放入U盘根目录, 插上盒子的USB口.

  2. 执行以下命令 开启U盘供电

echo 33 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio33/direction
echo 1 > /sys/class/gpio/gpio33/value

命令行会输出识别到的 usb storage 设备

# usb-storage 1-1:1.0: USB Mass Storage device detected
scsi host1: usb-storage 1-1:1.0
scsi 1:0:0:0: Direct-Access     Generic  Flash Disk       8.07 PQ: 0 ANSI: 4
sd 1:0:0:0: [sda] 15974400 512-byte logical blocks: (8.18 GB/7.62 GiB)
sd 1:0:0:0: [sda] Write Protect is off
sd 1:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA sda:
sd 1:0:0:0: [sda] Attached SCSI removable disk
udisk1110 -> /dev/sda
  1. 用 blkid 能看到U盘对应的分区, 根据U盘分区方式的不同可能是 /dev/sda 也可能是 /dev/sda1

  2. 挂载U盘到 /mnt/usb1

mount /dev/sda /mnt/usb1
# 或者
mount /dev/sda1 /mnt/usb1

这时候ls /mnt/usb1要能看到 stretch.tar.bz2 和 bootargs2 这两个文件

  1. /dev/mmcblk0p6 是用于放置新系统的目标分区, 先格式化
mkfs.ext4 /dev/mmcblk0p6

然后挂载到 /tmp/mmc, 如果提示couldn't mount as ext3 due to feature incompatibilities, 可以忽略

mkdir /tmp/mmc
mount /dev/mmcblk0p6 /tmp/mmc
  1. 解压 Debian 到 /tmp/mmc, 如果要看详细输出, 加上 v 参数
tar xjpf /mnt/usb1/stretch.tar.bz2 -C /tmp/mmc

注意结束时的输出, 如果最后提示一个 magic 写入错误, 可以忽略, 如果是显示其它类型的错误, 要检查一下, 是否U盘文件损坏

  1. 用 bootargs2 覆盖当前的 bootargs
dd if=/mnt/usb1/bootargs2 of=/dev/mmcblk0p2

这一步用于改变启动参数, 重启后将从 /dev/mmcblk0p5 (64bit kernel) 启动.

附录

GPIO 操作

通过GPIO操作LED

# 打开
echo 255 > /sys/class/leds/green:fn/brightness
# 关闭
echo 0 > /sys/class/leds/green:fn/brightness

触发, 如闪烁、管理mmc读写等. 通过cat命令可以看到 LED 支持的触发方式, 通过echo回写相应的字符串可以实现 LED 的自动触发, 如heartbeat代表闪烁, mmc0 代表 mmc0 的读写触发 LED 等等

env 记录

正常启动的 bootargs 参数

root@n2ns1:~# fw_printenv 
bootdelay=1
baudrate=115200
bootfile="uImage"
ethaddr=C6:04:53:66:0E:36
filesize=3702000
fileaddr=1000000
netmask=255.255.255.0
ipaddr=192.168.1.10
serverip=192.168.1.254
bootargs_stock=mem=1G mmz=ddr,0,0,60M vmalloc=500M console=ttyAMA0,115200 initrd=0x11000000,0x4600000 root=/dev/ram blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),10M(stock_kernel),60M(stock_squash),32M(kernel),-(rootfs)
bootargs_debian=mem=1G mmz=ddr,0,0,120M console=ttyAMA0,115200 root=/dev/mmcblk0p6 rw blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),10M(stock_kernel),60M(stock_squash),32M(kernel),-(rootfs)
bootargs_512M=mem=512M mmz=ddr,0,0,256M
bootargs_1G=mem=1G mmz=ddr,0,0,380M
bootargs_2G=mem=2G mmz=ddr,0,0,600M
ethact=up
bootcmd_debian=mmc read 0 0x10000000 0x24000 0x10000;setenv bootargs ${bootargs_debian};bootm 0x10000000
bootcmd_stock=mmc read 0 0x10000000 0x1000 0x5000;mmc read 0 0x11000000 0x6000 0x1e000;setenv bootargs ${bootargs_stock};bootm 10000000
stdin=serial
stdout=serial
stderr=serial
ver=Fastboot 3.3.0 (htpc@htpc4105) (Dec 17 2021 - 11:19:34)
bootcmd=mmc read 0 0x10000000 0x24000 0x10000;setenv bootargs ${bootargs_debian};bootm 0x10000000

recovery 环境的 env 带引导的命令和内核参数

# printenv
USER=root
LD_LIBRARY_PATH=/lib:/usr/local/lib:/usr/lib:/usr/share/bluetooth/lib:/hybroad/lib
SHLVL=1
TERMINFO=/usr/share/terminfo
HOME=/root
LOGNAME=root
TERM=vt100
PATH=/hybroad/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
SHELL=/bin/sh
PWD=/root

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/839585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构和算法】排序算法

说明:以下排序如无特别说明,都是从小到大升序排序 1. 冒泡排序 核心思想:每个元素与其相邻元素比较,如果前者大于后者则交换,每次循环结束后会将最大值放到最后,像小水泡从底下冒到上面成大水泡一样&…

选择结构的学习

选择结构 思考以下问题: 常用的逻辑运算符及其作用? 请写出判断分数大于 60 并且分数小于 100 的表达式 if-else 选择结构执行的顺序是什么? 多重 if 选择结构的执行流程是怎样的? if 选择结构书写规范有哪些? 通过下…

SAP通过 SWO3找一些不在事务码BAPI里面的BAPI

找BAPI BAPI_SALESDOCUMENT_COPY 首先事务码BAPI: 下面的所有方法都找不到(随便点开一个) 进SWO3 双击进去,继续往下点,找到了

学习左耳听风栏目90天——第一天 1-90(学习左耳朵耗子的工匠精神,对技术的热爱)【洞悉技术的本质,享受科技的乐趣】

洞悉技术的本质,享受科技的乐趣 第一篇,我的感受就是 耗叔是一个热爱技术,可以通过代码找到快乐的技术人。 作为it从业者,我们如何可以通过代码找到快乐呢?这是一个问题? 至少目前,我还没有这种…

调试技巧(2)

6. 如何写出好(易于调试)的代码 6.1 优秀的代码: 代码运行正常bug很少效率高可读性高可维护性高注释清晰文档齐全 常见的coding技巧: 使用assert尽量使用const养成良好的编码风格添加必要的注释避免编码的陷阱。 这里讲一下assert…

python中计算2的32次方减1,python怎么算2的3次方

大家好,给大家分享一下怎么样用python编写2的n次方,n由键盘输入,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! ---恢复内容开始--- 1、内置函数:取绝对值函数abs() 2、内置函数:取最大值max()&#xff…

【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比

【数据结构与算法——TypeScript】 算法的复杂度分析 什么是算法复杂度(现实案例)? ❤️‍🔥 前面已经解释了什么是算法? 其实就是解决问题的一系列步骤操作、逻辑。 ✅ 对于同一个问题,我们往往有很多种解决思路和方法&#x…

url重定向

不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。 如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话 就可能发生"跳错对象"的问题。 url跳转比较直接的危害是…

【网络工程】网络流量分析工具 Wireshark

文章目录 第一章:WireShark介绍第二章:WireShark应用第三章:Wireshark 实战 第一章:WireShark介绍 Wireshark (前身 Ethereal):它是一个强大的网络包分析工具 ! 此工具主要是用来捕获网络数据包的,并且自动…

CBCGPRibbon 添加背景图片

resource.h中声明资源的ID:ID_RIBBON_BACKIMAGE rc文件中添加png图片路径: ID_RIBBON_BACKIMAGE PNG DISCARDABLE "res\\bkribbon.png" 代码中添加下测: //添加背景图片 m_wndRibbonBar.SetBackgroundImage(ID_RIB…

Redis 总结【6.0版本的】

如果源码不编译,是无法实现自动跳转的, Redis在win上编译有点麻烦,我是使用的CentOS环境,Clion编译 编译完就可以直接通过shell连接Redis server了 server.c 中放的是就是主类 :6000多行左右是入口main()函数位置 Red…

RabbitMQ 教程 | 第10章 网络分区

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

分布式电网动态电压恢复器模拟装置电子设计大赛

wx供重浩:创享日记 对话框发送:85电网 获取完整论文报告结构框图工程源文件 摘要:本装置采用DC-AC及AC-DC-AC双重结构,前级采用功率因数校正(PFC)电路完成AC-DC变换,改善输入端电网电能质量。后…

01背包笔记

01背包题目链接 题意&#xff1a;有一个容量为m的背包以及n个可以拿的物品&#xff0c;给出n个物品的体积和价值&#xff0c;要求输出可以拿的最大价值 思路&#xff1a;代表在前i件物品中拿取总体积不超过j的最大价值 由此可以分情况讨论状态转移 当j<v[i]时&#xff0c;说…

【总结】p50蓝图概念、面向对象思想、函数事件宏的区别

p50蓝图概念、面向对象思想、函数事件宏的区别 函数的概念&#xff08;纯虚函数和函数&#xff09;宏的概念函数、事件、宏的区别变量的概念面向对象思想&#xff08;封装、继承、多态&#xff09;类和对象的关系Object、actor、pawn、Character、component之间的区别控制权、玩…

RTT(RT-Thread)时钟管理

目录 时钟管理 时钟节拍 RTT工程目录结构介绍 配置文件&#xff1a;rtconfig.h 获取系统节拍 获取系统节拍数函数 实例 定时器 RT_Thread定时器介绍 定时器源码分析&#xff08;了解即可&#xff09; rt_system_timer_init (硬件定时器初始化) rt_system_timer_thr…

python文件与目录操作

目录 文件编码 文件的读取 打开文件 mode常用的三种基础访问模式 读取文件 关闭文件 with open语法 文件的写入操作 文件综合案例 a.txt内容 代码实现 b.txt文件 目录操作 前言 os模块 具体方法 os.path模块 具体方法 文件编码 前言&#xff1a;由于计算机…

【在英伟达nvidia的jetson-orin-nx上使用调试can基础收发-硬件连接-开机自启动can-初步调试】

【在英伟达nvidia的jetson-orin-nx上使用调试can基础收发-硬件连接-开机自启动can-初步调试】 1、概述2、实验环境3、自我学习4-1、实验过程1、硬件原理图焊接连接模块2、输入命令3、测试过程 4-2、目前遗留问题# 1-1、发送可以发送&#xff0c;但是PC发送数据收不到。# 1-2、接…

任务 13、MidJourney种子激发极致创作,绘制震撼连贯画作

13.1 任务概述 通过本次实验任务&#xff0c;学员将深入了解Midjourney种子的概念和重要性&#xff0c;以及种子对生成图像的影响。他们将学会在Midjourney平台中设置种子值并调整其参数&#xff0c;以达到所需的效果。此外&#xff0c;任务还详细介绍了Midjourney V4.0版本中…

周末作业 c高级

1.判断家目录下&#xff0c;普通文件的个数和目录文件的个数&#xff1a; #!/bin/bash arr1(ls -la ~/|cut -d r -f 1|grep -wi d) arr2(ls -la ~/|cut -d r -f 1|grep -wi -)echo "普通文件个数为&#xff1a;${#arr2[*]}" echo "目录文件个数为&#xff1a;$…