vivi的stage2中一开始就通过putstr()函数调用串口显示信息,表明vivi的开始。
//putstr("\r\n");
//putstr(vivi_banner);
void putstr(const char *str) { putnstr(str, strlen(str)); }
# strlen用来求字符串的长度用的
# 而sizeof是用来求指定变量或者变量类型等所占内存大小用的
void putnstr(const char *str, size_t n) { if (str == NULL) return;
while(n && *str != '\0') { putc(*str); str++; n--; } }
void putc(char c) { PROC_SERIAL_PUTC(c); }
#define PROC_SERIAL_PUTC(c) \ ({ while (!SERIAL_WRITE_READY()); \ SERIAL_WRITE_CHAR(c); })
#define SERIAL_WRITE_READY() ((UTRSTAT0) && UTRSTAT_TX_EMPTY) #define SERIAL_WRITE_CHAR(c) ((UTXH0) = (c))
#define UTRSTAT0 (*(volatile unsigned long *)0x50000010) #define UTRSTAT_TX_EMPTY (1 << 2)
|
putstr()--->putnstr()--->putc()--->
上面的代码我是按照调用顺序些出来,但是实际的程序中是不推荐这么写的
下面这个函数有一定的错误。其实也不叫错误,就是这个函数根本就没实现任何功能
首先我们跟踪函数的调用来看源程序
25 static int
26 read_bt_status(void)
27 {
28 ulong status;
29
30 //status = ((GPLR & (1 << GPIO_PWBT)) >> GPIO_PWBT);
31 status = ((PWBT_REG & (1 << PWBT_GPIO_NUM)) >> PWBT_GPIO_NUM);
32
33 if (status)
34 return HIGH;
35 else
36 return LOW;
37 }
38
39 static int
40 is_pressed_pw_btn(void)
41 {
42 return read_bt_status();
43 }
44
45 static void
46 hard_reset_handle(void)
47 {
48 #if 0
49 clear_mem((unsigned long)(DRAM_BASE + VIVI_RAM_ABS_POS), \
50 (unsigned long)(DRAM_SIZE - VIVI_RAM_ABS_POS));
51 #endif
52 clear_mem((unsigned long)USER_RAM_BASE, (unsigned long)USER_RAM_SIZE);
53 }
54
55 static void
56 soft_reset_handle(void)
57 {
58 /* nothing to do */
59 }
60
61 void
62 reset_handler(void)
63 {
64 int pressed;
65
66 pressed = is_pressed_pw_btn();
67
68 if (pressed == PWBT_PRESS_LEVEL) {
69 DPRINTK("HARD RESET\r\n");
70 hard_reset_handle();
71 } else {
72 DPRINTK("SOFT RESET\r\n");
73 soft_reset_handle();
74 }
75 }
|
作者的本意是区分软复位和硬复位,但是在配置的时候我们都没有配置这个功能(配置则出错,相关的寄存器没有定义)
1 /*
2 * vivi/include/memory.h
3 *
4 * Copyright (C) 2001,2002 MIZI Research, Inc.
5 *
6 * $Id: reset_handle.h,v 1.1.1.1 2004/02/04 06:22:25 laputa Exp $
7 */
8
9 #ifndef __VIVI_RESET_H__
10 #define __VIVI_RESET_H__
11
12 #include <config.h>
13
14 #ifdef CONFIG_RESET_HANDLING
15 void reset_handler(void);
16 #else
17 #define reset_handler() (void)(0)
18 #endif
19
20 #endif /* __VIVI_RESET_H__ */
|
从上面的头文件就可以看出来,实际上将reset_handler()定义为空函数。
阅读(1147) | 评论(0) | 转发(0) |