Chinaunix首页 | 论坛 | 博客
  • 博客访问: 850361
  • 博文数量: 190
  • 博客积分: 7021
  • 博客等级: 少将
  • 技术积分: 1752
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 19:26
文章分类

全部博文(190)

文章存档

2014年(9)

2011年(32)

2010年(149)

我的朋友

分类: LINUX

2010-06-07 11:08:43

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(&& *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        (<< 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()定义为空函数。
阅读(1112) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~