HI3798MV200驱动移植

article/2025/10/25 16:02:14

目录

1.UBOOT配置修改方法

2.由EMMC启动改为SPI NAND FLASH 启动

3.网络调试

4.PHY复位

5.内核起来网络不通

6.增加RTC

7.PHY 灯ACT LINK 问题

8.PHY link状态查询

9.ETH0 网络状态灯修改


1.UBOOT配置修改方法

需要对应版本的HITOOL,个人也是废了很大劲,开始版本不对,怎么调试都不对。首先打开界面之后附带各种工具,修改配置需要用到HIREGBIN(用xls的方法没学会,学会了再分享吧,感觉还是这个工具方便点)。

首先将芯片切换成HI3798MV200,点击HIREGBIN,弹出对话框,选择对应文件

source\boot\sysreg\hi3798mv200 hi3798mv200_reg_base_v1.5.9.bin

加载完成后选择从reg导入查看,浏览选择对应文件

根据个人理解,分享一些信息,有不对的请指正。HI3798M与之前HI3536的有些不同,HI3798M一次可以写入多个配置,通过V18管脚的AD采样数值才确定加载那一种文件。对应的加载关系在Source\boot\fastboot.mak中可以修改,在\config\hi3798mv200\hi3798mv2dmo_hi3798mv200_cfg.mak文件有名称定义。

Source\boot\fastboot.mak

此次应用采用1.925V采样,对应文件是

source\boot\sysreg\hi3798mv2dmc_hi3798mv200_DDR4-2133_2GB_16bitx2_4layers.reg

导入后即可修改DDR配置、管脚复用等信息

2.由EMMC启动改为SPI NAND FLASH 启动

系统允许一起来了,不过DEMO是EMMC,要改成SPI NAND FLASH启动。首先配置表里的SPI NAND配置管脚必须要选择正确。注意复用里有个启动方式选项,修改此处为SPI管脚复用会自动修改。注意此处只是修改管脚复用,不代表选SPI了就必须从SPI启动,如果SPI 和EMMC管脚复用都选择的话,根据硬件设置是可以切换的,不过对应的烧写文件有稍微的区别。

对应修改硬件的启动模式,将系统改成SPI NAND 启动。但是UBOOT烧写不成功……

原因查了2天,最终通过打印发现SPI NAND 不识别的原因是 \config\hi3798mv2x.h中的CONFIG_SPI_NAND_SUPPORT未定义,导致

CONFIG_HIFMC100_SPI_NAND_SUPPORT未定义

#  ifdef CONFIG_SPI_NAND_SUPPORT

#    define CONFIG_HIFMC100_SPI_NAND_SUPPORT

#  endif

最后导致

drivers/mtd/nand/hinfc_init.c:88:#ifdef CONFIG_HIFMC100_SPI_NAND_SUPPORT

drivers/mtd/nand/nand.c:48:#ifdef CONFIG_HIFMC100_SPI_NAND_SUPPORT

中SPI NAND 程序未执行

解决方法:增加

#define CONFIG_SPI_NAND_SUPPORT         1

3.网络调试

开始UBOOT下调试网络发现网络不通,测了一些信号发现PHY一直被复位,配置表格里选的是RGMII_RST。最后改成GPIO,手动增加复位了,复位在内核中添加了,后面再介绍

在这分享一下UBOOT PHY 初始化过程

start_armboot

arch\arm\lib\board.c

eth_initialize

net\eth.c

board_eth_init

board\hi3798mv2x:board.c

higmac_initialize

driver\net\higmacv300

parse_module_parameters

driver\net\higmacv300

get_eth_phymdio

board\hi3798mv2x:eth_cfg_setup.c

4.PHY复位

UBOOT修改完了,开始移植内核,分享一些经验

在根目录执行make build的话要编译文件系统,时间比较长。执行完可以单独执行make hiboot 和make linux单独编译UBOOT和内核。

另外有时候make build编译内核时过不去,注意提示会有recipe for target 'prepare3' failed。在内核目录执行make mrproper,再回根目录执行make build即可

drivers/net/ethernet/hisilicon/higmac/higmac.c 引用 higmac_hw_phy_reset(priv);

此文件在drivers/net/ethernet/hisilicon/higmac/board.c中,执行软复位或者硬复位

对应是寄存器0xF8A2_20CC的第5位,PHY 软复位功能

设备树文件位置:linux-4.4.y/arch/arm/boot/dts /hi3798mv200.dts

IO硬复位通过设备树中phy-gpio-base 体现,本设计采用GPIO7_1,将phy-gpio-base修改为GPIO7的地址,phy-gpio-bit修改为1

        phy-gpio-base = <0xF8B27000>;

               phy-gpio-bit = <1>;

不过原函数为软复位,增加硬复位,增加HIGMAC_RESET_PHY_BY_GPIO。注意原程序中如果执行软复位的话就不执行硬复位了,修改一下判断关系即可。

5.内核起来网络不通

Ifconfig没有信息,输入如下信息,或者加入/etc/init.d/rcS中

ifconfig eth0 down

ifconfig eth0 hw ether xxxx

ifconfig eth0 xxx netmask xxx

ifconfig eth0 up

route add default gw xxxx

同样设置eth1即可

6.增加RTC

需要在内核中增加RTC,首先将menuconfig配置文件修改(新手一枚,方式有点笨),

在xxx/HiSTBLinuxV100R005C00SPC050/source/kernel/linux-4.4.y/目录下执行

Cp  /home/emo/hi3798/HiSTBLinuxV100R005C00SPC050/source/kernel/linux-4.4.y/arch/arm/configs/hi3798mv200_defconfig  .config

将.config文件替换为当前配置文件

再执行make ARCH=arm CROSS_COMPILE=arm-histbv320-linux- menuconfig,执行

/RTC  搜索。 进入device drivres------real time clock ,选中 再进入选中ds1307

保存退出,然后将系统配置文件更新

Cp  .config  xxx/kernel/linux-4.4.y/arch/arm/configs/hi3798mv200_defconfig

确认管脚复用没问题,在设备树的I2C中增加对应RTC信息,编译。

烧写后系统运行提示OPPS,查看说有空指针。最后定位在chips[id->driver_data]上。将rtc-ds_1307.c中chips[id->driver_data]改成ds_1307就好了(此处改动有些武断,也请高手指点)

7.PHY 灯ACT LINK 问题

此次采用RTL8211,网络灯配置需要修改,参见手册。

发现Higmac.c调用phy_register_fixups最终指向

drivers/net/ethernet/hisilicon/higmac/phy_fix.c中rtl8211f_phy_fix,在其中增加LED设置即可。

8.PHY link状态查询

drivers/net/phy/phy.c:94:                  "Link is Up - %s/%s - flow control %s\n",

RGMII TXDL 延时控制,这个寄存器应该是隐藏的,手册里并没有体现,此处只做记录。

enable TXDLY

9.ETH0 网络状态灯修改

因为自带的灯被RGMII占用了,无耐只能接其他GPIO模拟一下,写了一个测试程序,检测网络状态,控制LED,对linux还不太熟,仅作为测试使用。

附 链接:

HI3798MV200 对应HItool 含配置表格修改工具HIREGBIN

https://download.csdn.net/download/Emo_snaf/20720584?spm=1001.2014.3001.5501

HI3798MV200 手册,含芯片手册、HiRegBin 工具使用指南和linux开发环境用户指南

https://download.csdn.net/download/Emo_snaf/20720549?spm=1001.2014.3001.5501

HI3798M GPIO模拟网络灯控制

https://download.csdn.net/download/Emo_snaf/20720527?spm=1001.2014.3001.5501


http://chatgpt.dhexx.cn/article/9Lkackd9.shtml

相关文章

M301H-BYT代工-支持Hi3798 MV300H/MV300/MV310芯片-当贝纯净桌面-强刷卡刷固件包

M301H-BYT代工-支持Hi3798 MV300H&#xff0f;MV300&#xff0f;MV310芯片-当贝纯净桌面-强刷卡刷固件包 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff…

Hi3798 openSSH的移植

前言 在编译海思SDK时&#xff0c;会自动编译openssl&#xff0c;zlib&#xff0c;故无需重复编译这两者。 编译 编译openssh 本文下载openssh-7.3p1版本&#xff0c;将其下载至虚拟机 tar -xvf openssh-7.3p1.tar.gz ./configure --hostarm-linux --prefix/usr/local/ope…

海思HI3798M GPIO和PWM操作

一、GPIO拉高拉低操作 以GPIO2_7为例 地址&#xff08;0xF8B2_2400&#xff09; 基地址&#xff08;0xF8B2_2000&#xff09; 偏移地址&#xff08;0x00000400&#xff09; ①把GPIO2_7管脚复用设置为IO模式 himm 0xF8B2205C 0x00&#xff08;0xF8B2205C 基地址0xF8B2_2000 …

海思Hi3798MV100机顶盒芯片介绍

Hi3798M V100是海思推出的专门针对OTT机顶盒市场的高性价比芯片方案。在码流兼容性、在线视频播放的流畅性、图像质量以及整机性能方面保持业界最好的用户体验。集成四核高性能处理器、内置NEON&#xff0c;其处理性能可以满足各种差异化的业务需求&#xff0c;支持Dolby和DTS音…

海思Hi3798MV300_Hi3798MV300H_Datasheet-系统

Hi3798MV300/Hi3798MV300H处理器子系统 Hi3798MV300/Hi3798MV300H采用 ARMCortex-A53MPCore 四核处理器&#xff0c;Cortex-A53 MPCore 具有以下特点&#xff1a;  处理器集成了 256KB L2 cache。  支持 ARMv8-A 架构。  支持 DVFS 自动调频调压和 AVS 自适应调压。 …

海思Hi3798处理器参数,Hi3798芯片详细信息介绍

Hi3798C V200集成4核64位高性能Cortex A53 处理器、内置NEON 加速引擎&#xff0c;强大的CPU 处理能力可以满足各种差异化的业务需求。在码流兼容性、在线视频播放的流畅性、图像质量以及整机性能方面保持业界最好的用户体验。支持4K 2KP6010bit 超高清视频解码和显示&#xff…

Linq两个List集合取交集

来自森大科技官方博客 http://www.cnsendblog.com/index.php/?p210 GPS平台、网站建设、软件开发、系统运维&#xff0c;找森大网络科技&#xff01; http://cnsendnet.taobao.com 1、法一&#xff1a;常规方法 2、嗯&#xff0c;.NET中所有的sort&#xff0c;compare都支持…

两个对象List根据属性取交集和差集

背景介绍 咸鱼君最近做了个需求, excel导入功能, 其中 需要对已导入条目的做“更新” 未导入的条目做“新增” 其余的做“删除” 细品需求 无非是对excel的数据和数据库的数组做个差集, 交集的处理 打个比方: excel的数据我们定义为 newList 已导入的数据我们定义为 …

java8 Stream流 两个list取交集,获取共有数据

代码&#xff1a; public static void main(String[] args) {List<String> list1 Arrays.asList("a","b","c");List<String> list2 Arrays.asList("b","c","d");List<String> intersection …

Java-两个较大的List快速取交集、差集

工作中经常遇到需要取两个集合之间的交集、差集情况&#xff0c;但是普通的retainAll()和removeAll()无法满足数据量大的情况&#xff0c;由此就自己尝试运用其他的方法解决。注&#xff1a;如果数据量小的情况下&#xff0c;还是使用retainAll()和removeAll()方便 1.假使不存在…

java中两个list对象取交集、差集

在一般操作中&#xff0c;对于list集合取交集、差集、并集&#xff0c;比较简单&#xff0c;网上有很多例子&#xff0c;如&#xff1a; 今天我们来说一下对于两个list集合该如何取交集与并集&#xff1a; 如下两个集合&#xff1a;groupEntityList、saveEntities&#xff0c;…

两个 list 求交集

两个 list 求交集, 一种方式是手动遍历, 然后判断是否 contains, 然后添加到结果 list 中 这里介绍另外一个方法 直接调用 list1.retainAll(list2), 调用完成后, list1 中不在 list2 的元素都会被剔除, 此时 list1 就是交集 /*** retain* 保留*/Testpublic void testRetain() …

部署Kubernetes Dashboard 及监控组件 Heapster

部署Dashboard 项目地址&#xff1a;https://github.com/kubernetes/dashboard 1.下载官方提供的 Dashboard 组件部署的 yaml 文件 wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml也可以使用Kuber…

heap类型

重点思想&#xff1a; 第一轮从k个list中拿出第一个&#xff08;若每个list非空的话&#xff1b;有可能为空&#xff09;放入minheap中&#xff0c;minheap一直储存k个lists中最小的那个数&#xff0c;对顶代表当前最小的数&#xff0c;需要插入result listnode。所有list每个n…

Python heap

原文&#xff1a;https://blog.csdn.net/dta0502/article/details/80834787 堆是一类特殊的树&#xff0c;堆的通用特点就是父节点会大于或小于所有子节点&#xff08;儿子不分左右&#xff09;。一个最小堆&#xff08;min-heap&#xff09;就是其中的每一个节点都小于或等于…

Stack and Heap

JVM 分配内存进入以下区域 1&#xff1a; Heap 2&#xff1a;Stack 3&#xff1a;Code 4&#xff1a;Static jvm有效的管理分配到这几个内存区域。 Code section 代码区 包含这个 字节码文件 (byte code) Stack section (栈区域) 包含 方法&#xff08;methods&a…

堆-heap

priority queue可以借用堆&#xff08;heap&#xff09;,binary heap是一种complete binary tree(完全二叉树&#xff09; 完全二叉树&#xff1a;binary tree除最底层叶节点之外&#xff0c;是填满&#xff0c;最底层叶节点由左到右不得有空隙。 用vector来存储所有节点&…

Kubernetes安装系列之heapster安装

虽然heapster已经即将退休&#xff0c;为了纪念一下&#xff0c;这篇文章整理一下heapstergrafanaInfluxdb组合对于kubernetes的node与资源进行监控的插件安装与设定方法&#xff0c;本文以脚本的方式进行固化&#xff0c;内容仍然放在github的easypack上。 整体操作 https:/…

Heapster -- Kubernetes Dashboard集成Heapster

原始kubernetes dashboard的界面中仅显示了pod一些配置信息&#xff0c;无法图形化展现集群度量指标信息。原始图如下&#xff08;此处从网上找了一个图..&#xff09;&#xff1a; 而如果要展示图形化的集群度量指标信息&#xff0c;就需要安装一个dashboard插件&#xff1a;h…

HeapSort

堆的定义&#xff1a; n个关键字序列K[1....n]称为堆&#xff0c;当且仅当改序列满足&#xff1a; 第一种为&#xff1a;小根堆&#xff1a;每个结点的值都小于或等于左右孩子结点 第二种为&#xff1a;大根堆&#xff1a;每个结点的值都大于或等于左右孩子结点 堆是一种完全二…