/* turn off the watchdog */ #if defined(CONFIG_S3C2400) # define pWTCON 0x15300000 # define INTMSK 0x14400008 /* Interupt-Controller base addresses */ # define CLKDIVN 0x14800014 /* clock divisor register */ #elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) # define pWTCON 0x53000000 # define INTMOD 0X4A000004 # define INTMSK 0x4A000008 /* Interupt-Controller base addresses */ # define INTSUBMSK 0x4A00001C # define CLKDIVN 0x4C000014 /* clock divisor register */ #endif
上面几个宏定义所对应的地址,都可以在对应的datasheet中找到对应的定义: 其中,S3C2410和TQ2440开发板所用的CPU S3C2440,两者在这部分的寄存器定义,都是一样的,所以此处,采用CONFIG_S3C2410所对应的定义。 关于S3C2440相关的软硬件资料,这个网站提供的很全面: http://just4you.springnote.com/pages/1052612 其中有S3C2440的CPU的datasheet: 其中有对应的寄存器定义: 而关于每个寄存器的具体含义,见后面的分析。 |
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) ldr r0, =pWTCON
这里的ldr和前面介绍的ldr指令不是一个意思。 这里的ldr是伪指令ldr。
而这里的: ldr r0, =pWTCON 意思就很清楚了,就是把宏pWTCON的值赋值给r0寄存器,即 r0=0x53000000 |
mov r1, #0x0
mov指令语法:
不过对于MOV指令多说一句,那就是,一般可以用类似于: MOV R0,R0 的指令来实现NOP操作。 上面这句mov指令很简单,就是把0x0赋值给r1,即 r1=0x0 |
所以,上面几行代码意思也很清楚:
先是用r0寄存器存pWTCON的值,然后r1=0,再将r1中的0写入到pWTCON中,其实就是
pWTCON = 0;
而pWTCON寄存器的具体含义是什么呢?下面就来了解其详细含义:
注意到bit[0]是Reset Enable/Disable,而设置为0的话,那就是关闭Watchdog的reset了,所以其他位的配置选项,就更不需要看了。
我们只需要了解,在此处禁止了看门狗WatchDog(的复位功能),即可。
关于看门狗的作用,以及为何要在系统初始化的时候关闭看门狗,请参见本文档后面的章节:第 3.3 节 “什么是watchdog + 为何在要系统初始化的时候关闭watchdog”