7656
- 收藏
- 点赞
- 分享
- 举报
外部看门狗,U-boot终于搞定了,发帖庆祝一下
本帖最后由 ngswfx 于 2016-4-23 18:44 编辑
我用的方法自己感觉就是苦力活,这那是在编程,简直是“搬代码砖头”。
之所以要在U-boot搞这个看门狗,那也是被逼无奈,系统下外部看门狗,前几天已经搞定了。这几天又搞定了U盘文件系统升级,其实以前就弄好了,只不过,自己U盘不行,一直以为代码没弄好。前几天找了个新U盘发现可以升级时,升级到一半,大约50秒左右,系统自动重启。
哎,又爱又恨的外部狗动作了。只能硬着头皮,几乎把U-boot目录翻了个底朝天。看结构,研究那些东西和3520D流程有关......,U-boot目录东西,一大堆,也不知道那些被编译了,那些没有被真正使用。只能自己添加printf,打印信息,然后不停的刷呀刷。
其实最主要的是找到写寄存器的代码,找到升级的详细流程代码所在的文件位置,没有文档介绍,只能一个个目录看,一个个C文件看(当然都是一扫而过,然后把可能用到的文件记录下来),推敲有没有用到的可能。
首先研究U-boot代码,找到能写寄存器的代码,其实3520D里面就是那个
Hi3520D_SDK/osdrv/uboot/u-boot-2010.06/board/hi3520d/board.c
文件中发现了
reg = readl(CRG_REG_BASE + PERI_CRG57);
reg &= ~UART_CKSEL_APB;
writel(reg, CRG_REG_BASE + PERI_CRG57);
这就是读写寄存器的代码了。
////////////////////////////////
然后就是找一个watchdog.c模板,哪个都可以,自己写也行,就是添加如下这2个函数而已:
static int bDogOutState=0;
static int bDogInited=0;
void watchdog_reset(void)
{
if(!bDogInited)
return;
if(bDogOutState>1){
writel(0x00, 0x201D0200); //外部狗接的GPIO8_7
bDogOutState=0;
}else{
writel(0xFF, 0x201D0200);
bDogOutState++;
}
}
int watchdog_init(void)
{
/////
writel(0x01, 0x200F0008);////外部狗接的GPIO8_7
udelay(100);
writel(0xFF, 0x201D0400);
udelay(100);
bDogInited=1;
return 0;
}
然后就是开启全局,允许看门狗。
文件
Hi3520D_SDK/osdrv/uboot/u-boot-2010.06/include/configs/hi3520d.h
里面添加了
#define CONFIG_WATCHDOG
全局就打开了。
然后就是沿着U-boot启动流程,开始长征一样的的添加头文件,添加喂狗代码。现在想想全局添加应该起作用的,但多一次无妨,应为编译一次也挺费尽,编译才发现缺少头文件就郁闷了。
#include
watchdog_reset();
watchdog_reset();
watchdog_reset();
到处都在添加.
现在想想,主要是几个地方,都是沿着自动升级的流程来的。
SPI flash读取 mtd目录下的spi目录下的hisfc350目录内的几个文件
Fat目录下的fat.c
disk目录下的part.c
都搞定了一步步测试,终于能升级撑过1分钟了(兴奋异常,这已经表明喂狗起作用了,仅仅是有些地方没喂及时,导致的重启),到升级文件CRC这里不行了,因为rootfs升级,文件较大,估计超过1秒的时间占用了。
又去找crc32代码,
Hi3520D_SDK/osdrv/uboot/u-boot-2010.06/lib/crc32.c
文件中,修改了半天,编译过不了,提示找不到watchdog_reset,后来想想也对,系统编译crc32.c比较靠前,此时,watchdog.c还没编译呢,哪里来的watchdog_reset。(按理说肯定有更好的解决方法,因为crc32.c里面默认就有watchdog相关代码)
想想,我这个半路出家的程序猿(不是学习计算机出身的,工作后自己研究学习的,计算机基础理论很差,只要一深入,没戏),实在有心无力搞定这复杂的编译环境。
最后干脆吧crc32代码拷贝一份,放到Hi3520D_SDK/osdrv/uboot/u-boot-2010.06/product/hiupdate/auto_update.c文件中,把函数改变一下名字。(当时已经做好准备实在高不定,去除CRC代码了,呵呵)
就这样,升级OK了,狗没有重启系统。
感觉就是这种外部狗,没法临时关闭,真费劲。代码真乱。感觉加了1千多个喂狗动作(当然990个都是白搭,没必要)。慢慢长征路。哎,不管了,先这么用着吧,懒得再去折腾这10几个文件了,关键目录一层一层,找半天。
现在想想,GPIO8_7是一个CLCK引脚,要是能开机,让时钟出来,由时钟去喂狗,能被控制住,应该不用这么费劲了(当然,这还要看,这个时钟是不是符合狗WDI要求了)。
//////////////////////////////经查,这个脚好像是输入脚,不能这么用
我用的方法自己感觉就是苦力活,这那是在编程,简直是“搬代码砖头”。
之所以要在U-boot搞这个看门狗,那也是被逼无奈,系统下外部看门狗,前几天已经搞定了。这几天又搞定了U盘文件系统升级,其实以前就弄好了,只不过,自己U盘不行,一直以为代码没弄好。前几天找了个新U盘发现可以升级时,升级到一半,大约50秒左右,系统自动重启。
哎,又爱又恨的外部狗动作了。只能硬着头皮,几乎把U-boot目录翻了个底朝天。看结构,研究那些东西和3520D流程有关......,U-boot目录东西,一大堆,也不知道那些被编译了,那些没有被真正使用。只能自己添加printf,打印信息,然后不停的刷呀刷。
其实最主要的是找到写寄存器的代码,找到升级的详细流程代码所在的文件位置,没有文档介绍,只能一个个目录看,一个个C文件看(当然都是一扫而过,然后把可能用到的文件记录下来),推敲有没有用到的可能。
首先研究U-boot代码,找到能写寄存器的代码,其实3520D里面就是那个
Hi3520D_SDK/osdrv/uboot/u-boot-2010.06/board/hi3520d/board.c
文件中发现了
reg = readl(CRG_REG_BASE + PERI_CRG57);
reg &= ~UART_CKSEL_APB;
writel(reg, CRG_REG_BASE + PERI_CRG57);
这就是读写寄存器的代码了。
////////////////////////////////
然后就是找一个watchdog.c模板,哪个都可以,自己写也行,就是添加如下这2个函数而已:
static int bDogOutState=0;
static int bDogInited=0;
void watchdog_reset(void)
{
if(!bDogInited)
return;
if(bDogOutState>1){
writel(0x00, 0x201D0200); //外部狗接的GPIO8_7
bDogOutState=0;
}else{
writel(0xFF, 0x201D0200);
bDogOutState++;
}
}
int watchdog_init(void)
{
/////
writel(0x01, 0x200F0008);////外部狗接的GPIO8_7
udelay(100);
writel(0xFF, 0x201D0400);
udelay(100);
bDogInited=1;
return 0;
}
然后就是开启全局,允许看门狗。
文件
Hi3520D_SDK/osdrv/uboot/u-boot-2010.06/include/configs/hi3520d.h
里面添加了
#define CONFIG_WATCHDOG
全局就打开了。
然后就是沿着U-boot启动流程,开始长征一样的的添加头文件,添加喂狗代码。现在想想全局添加应该起作用的,但多一次无妨,应为编译一次也挺费尽,编译才发现缺少头文件就郁闷了。
#include
watchdog_reset();
watchdog_reset();
watchdog_reset();
到处都在添加.
现在想想,主要是几个地方,都是沿着自动升级的流程来的。
SPI flash读取 mtd目录下的spi目录下的hisfc350目录内的几个文件
Fat目录下的fat.c
disk目录下的part.c
都搞定了一步步测试,终于能升级撑过1分钟了(兴奋异常,这已经表明喂狗起作用了,仅仅是有些地方没喂及时,导致的重启),到升级文件CRC这里不行了,因为rootfs升级,文件较大,估计超过1秒的时间占用了。
又去找crc32代码,
Hi3520D_SDK/osdrv/uboot/u-boot-2010.06/lib/crc32.c
文件中,修改了半天,编译过不了,提示找不到watchdog_reset,后来想想也对,系统编译crc32.c比较靠前,此时,watchdog.c还没编译呢,哪里来的watchdog_reset。(按理说肯定有更好的解决方法,因为crc32.c里面默认就有watchdog相关代码)
想想,我这个半路出家的程序猿(不是学习计算机出身的,工作后自己研究学习的,计算机基础理论很差,只要一深入,没戏),实在有心无力搞定这复杂的编译环境。
最后干脆吧crc32代码拷贝一份,放到Hi3520D_SDK/osdrv/uboot/u-boot-2010.06/product/hiupdate/auto_update.c文件中,把函数改变一下名字。(当时已经做好准备实在高不定,去除CRC代码了,呵呵)
就这样,升级OK了,狗没有重启系统。
感觉就是这种外部狗,没法临时关闭,真费劲。代码真乱。感觉加了1千多个喂狗动作(当然990个都是白搭,没必要)。慢慢长征路。哎,不管了,先这么用着吧,懒得再去折腾这10几个文件了,关键目录一层一层,找半天。
现在想想,GPIO8_7是一个CLCK引脚,要是能开机,让时钟出来,由时钟去喂狗,能被控制住,应该不用这么费劲了(当然,这还要看,这个时钟是不是符合狗WDI要求了)。
//////////////////////////////经查,这个脚好像是输入脚,不能这么用
我来回答
回答11个
时间排序
认可量排序
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
22018-05-11 10:10:23
-
22018-08-26 10:19:08
-
102017-07-04 17:37:50
-
2018-12-24 09:30:14
-
102013-11-20 12:59:39
-
2017-09-21 15:55:37
-
2016-06-12 11:25:20
-
2024-06-06 10:57:21
-
2020-03-18 16:10:50
-
2020-08-31 19:17:11
-
2018-03-12 23:27:10
-
2021-03-05 13:13:27
-
2017-07-25 15:01:47
-
2016-03-26 11:00:38
-
2014-05-07 10:54:43
-
2018-07-24 09:19:44
-
2016-10-25 15:34:00
-
2017-08-27 13:54:27
-
2019-01-17 10:05:25
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认