*
板子做好了,能够工作吗,是很多工程师要问的问题,本代码段是一个完整的测试程序,其中包含了
printk的移植代码,可供dsp入门工程师用。
张驿风
*/
/*****************************************************/
/*project : led */
/*date : 2007-2-2 15:12 */
/*author : zhangyifeng */
/*function: blink led in dsp of bf533 */
/*dsp study */
/*****************************************************/
/*
Ver1.01 20070406 能够正确设置BF533的PLL
Ver1.02 20070419 serial工作正常
Ver1.03 20070419 printk移植成功
编译设置方法:
boot mode = spi slave
boot format = binary
programable = 4 (PF4 --> 连接powerpc405 GPIO31)
*/
#include <sys\exception.h>
#include <cdefBF533.h>
#include "ccblkfn.h"
#include "sysreg.h"
#include "serial.h"
#include "printk.h"
void Init_Flags(void){
*pFIO_INEN = 0x0000; //input buffer disable
*pFIO_DIR = (1<<11) | (1<<10); //set PF11 ,PF10 as output other as input ;
}
void inti_pll(void){
int new_PLL_CTL;
*pPLL_DIV = 6; //cpu 核1分频 =594Mhz 外围6分频 594/6 = 99Mhz
asm("ssync;");
new_PLL_CTL = 23 << 9; //23倍 22*27 = 594Mhz
// enable Wake-up from PLL event
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL){
*pPLL_CTL = new_PLL_CTL;
asm("ssync;");
asm("idle;");
}
}
void delms(unsigned long value){
unsigned long i,j;
for(i=0;i<value;i++){
for(j=0;j<10000;j++){
asm ("nop;");
}
}
}
void main(void){
sysreg_write(reg_SYSCFG, 0x32); //Initialize System Configuration Register
Init_Flags();
inti_pll();
initserial();
printf("Uart test\r\n");
printf(__DATE__ "\r\n");
printf(__TIME__ "\r\n");
while(1){
int ch;
ch = getchar();
putchar(ch);
putchar('\n');
putchar('\r');
switch(ch){
case 's':{
*pFIO_FLAG_S = (1<<11) ;
*pFIO_FLAG_C = (1<<10) ;
break;
}
case 'c':{
*pFIO_FLAG_C = (1<<11) ;
*pFIO_FLAG_S = (1<<10) ;
break;
}
case 'p':{
printk("printk test:%d,0x%x\r\n",356,356);
break;
}
default:{
printf("please s,c to control led.\r\n");
}
}
}
}
//-----------------------------------------------------------------------------------
/**************************************************************************/
/* 2007-04-19 移植到blackfin成功 */
/* 张驿风 */
/**************************************************************************/
#include <sys\exception.h>
#include <cdefBF533.h>
#include "ccblkfn.h"
#include "sysreg.h"
#include "serial.h"
#define ACCESS_LATCH *pUART_LCR |= UART_LCR_DLAB;
#define ACCESS_PORT_IER *pUART_LCR &= (~UART_LCR_DLAB);
void initserial(void){
*pUART_GCTL |= UART_GCTL_UCEN; // Enable UART
asm("ssync;");
ACCESS_LATCH; // Set DLAB in LCR to Access DLL and DLH
asm("ssync;");
*pUART_DLL = 0x284 & 0xFF;
asm("ssync;");
*pUART_DLH = (0x284 >> 8) & 0xFF;
asm("ssync;");
*pUART_LCR = UART_LCR_WLS8; //Set LCR to Word Lengh 8-bit word select
asm("ssync;");
}
void putchar(char data){
while(!((*pUART_LSR) & UART_LSR_TEMT));
*pUART_THR = data;
}
char kbhit(void){
if((*pUART_LSR) & UART_LSR_DR) return 0x55;
else return 0x00;
}
char getchar(void){
while(!((*pUART_LSR) & UART_LSR_DR));
return *pUART_RBR;
}
void printf(char *p){
while(*p != 0x00){
putchar(*(p++));
}
}
/*============================================================================*/
/*名称: SendHex (int hex) */
/*功能: 从串口设备发送Hex */
/*入口参数: 无 */
/*出口参数: 读出的数据 */
/*============================================================================*/
void sendhex (int hex) {
if (hex > 9) putchar('A' + (hex - 10));
else putchar('0' + hex);
}
/***********************************************************************/
/*名称:sendhexstr */
/*功能:发送hex字符串 */
/*入口参数:no */
/*出口参数:1 正确提供,2 ID不正确 0失败 */
/***********************************************************************/
#if SEND_HEX_STR16
void sendhexstr16(unsigned int Temp){
putchar('0');
putchar('x');
sendhex((Temp>>12)&0x0f);
sendhex((Temp>>8)&0x0f);
sendhex((Temp>>4)&0x0f);
sendhex(Temp&0x0f);
}
#endif
/***********************************************************************/
/*名称:sendhexstr */
/*功能:发送hex字符串 */
/*入口参数:no */
/*出口参数:1 正确提供,2 ID不正确 0失败 */
/***********************************************************************/
#define SEND_HEX_STR8 0
#if SEND_HEX_STR8
void sendhexstr8(unsigned char Temp){
//putchar('0');
//putchar('x');
sendhex((Temp>>4)&0x0f);
sendhex((Temp)&0x0f);
}
#endif
#define SEND_DEC_STR4 0
#if SEND_DEC_STR4
void IntToStr(u16 Value,u8 *Buf){
Buf[0] = (Value / 1000) + '0';
Buf[1] = (Value % 1000)/100 + '0';
Buf[2] = ((Value % 1000)%100)/10 + '0';
Buf[3] = ((Value % 1000)%100)%10 + '0';
}
/***********************************************************************/
/*名称:sendhexstr */
/*功能:发送hex字符串 */
/*入口参数:no */
/*出口参数:1 正确提供,2 ID不正确 0失败 */
/***********************************************************************/
void senddecstr4(u16 uValue){
unsigned char uStr[4];
IntToStr(uValue,uStr);
putchar(uStr[0]);
putchar(uStr[1]);
putchar(uStr[2]);
putchar(uStr[3]);
}
#endif
//-------------------------------------------------------------------------------------------------
#ifndef __SERIAL__H
#define __SERIAL__H
#define UART_THR_LO HALFWORD_REF(UART_THR)
#define UART_RBR_LO HALFWORD_REF(UART_RBR)
#define UART_DLL_LO HALFWORD_REF(UART_DLL)
#define UART_IER_LO HALFWORD_REF(UART_IER)
#define UART_IER_ERBFI 0x01
#define UART_IER_ETBEI 0x02
#define UART_IER_ELSI 0x04
#define UART_IER_EDDSI 0x08
#define UART_DLH_LO HALFWORD_REF(UART_DLH)
#define UART_IIR_LO HALFWORD_REF(UART_IIR)
#define UART_IIR_NOINT 0x01
#define UART_IIR_STATUS 0x06
#define UART_IIR_LSR 0x06
#define UART_IIR_RBR 0x04
#define UART_IIR_THR 0x02
#define UART_IIR_MSR 0x00
#define UART_LCR_LO HALFWORD_REF(UART_LCR)
#define UART_LCR_WLS5 0
#define UART_LCR_WLS6 0x01
#define UART_LCR_WLS7 0x02
#define UART_LCR_WLS8 0x03
#define UART_LCR_STB 0x04
#define UART_LCR_PEN 0x08
#define UART_LCR_EPS 0x10
#define UART_LCR_SP 0x20
#define UART_LCR_SB 0x40
#define UART_LCR_DLAB 0x80
#define UART_MCR_LO HALFWORD_REF(UART_MCR)
#define UART_LSR_LO HALFWORD_REF(UART_LSR)
#define UART_LSR_DR 0x01
#define UART_LSR_OE 0x02
#define UART_LSR_PE 0x04
#define UART_LSR_FE 0x08
#define UART_LSR_BI 0x10
#define UART_LSR_THRE 0x20
#define UART_LSR_TEMT 0x40
#define UART_MSR_LO HALFWORD_REF(UART_MSR)
#define UART_SCR_LO HALFWORD_REF(UART_SCR)
#define UART_GCTL_LO HALFWORD_REF(UART_GCTL)
#define UART_GCTL_UCEN 0x01
void putchar(char);
char getchar(void);
void printf(char *p);
char kbhit(void);
void SendToDis(unsigned char bits,unsigned char Value);
void sendhexstr8(unsigned char Temp);
void senddecstr4(unsigned int uValue);
void initserial(void);
#endif
//-----------------------------------------------------------------------------
/*-------------------------------------------------------------------------+
| printk.c v1.1 - PC386 BSP - 1997/08/07
+--------------------------------------------------------------------------+
| (C) Copyright 1997 -
| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
|
| http://pandora.ist.utl.pt
|
| Instituto Superior Tecnico * Lisboa * PORTUGAL
+--------------------------------------------------------------------------+
| Disclaimer:
|
| This file is provided "AS IS" without warranty of any kind, either
| expressed or implied.
+--------------------------------------------------------------------------+
| This code is based on code by: Jose Rufino - IST
|
| $Id: printk.c,v 1.3 2000/06/12 16:44:11 joel dead $
+--------------------------------------------------------------------------*/
#include <stdarg.h>
#include <printk.h>
/*-------------------------------------------------------------------------+
| Function: printNum
| Description: print number in a given base.
| Global Variables: None.
| Arguments: num - number to print, base - base used to print the number.
| Returns: Nothing.
+--------------------------------------------------------------------------*/
static void printNum(long unsigned int num, int base, int sign)
{
long unsigned int n;
int count;
char toPrint[20];
if ( (sign == 1) && ((long)num < 0) ) {
BSP_output_char('-');
num = -num;
}
count = 0;
while ((n = num / base) > 0) {
toPrint[count++] = (num - (n*base));
num = n ;
}
toPrint[count++] = num;
for (n = 0; n < count; n++){
BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]);
}
} /* printNum */
/*-------------------------------------------------------------------------+
| Function: printk
| Description: a simplified version of printf intended for use when the
console is not yet initialized or in ISR's.
| Global Variables: None.
| Arguments: as in printf: fmt - format string, ... - unnamed arguments.
| Returns: Nothing.
+--------------------------------------------------------------------------*/
void printk(char *fmt, ...)
{
va_list ap; /* points to each unnamed argument in turn */
char c, *str;
int lflag, base, sign;
unsigned int level;
_CPU_ISR_Disable(level);
va_start(ap, fmt); /* make ap point to 1st unnamed arg */
for (; *fmt != '\0'; fmt++)
{
lflag = 0;
base = 0;
sign = 0;
if (*fmt == '%')
{
if ((c = *++fmt) == 'l')
{
lflag = 1;
c = *++fmt;
}
switch (c)
{
case 'o': case 'O': base = 8; sign = 0; break;
case 'd': case 'D': base = 10; sign = 1; break;
case 'u': case 'U': base = 10; sign = 0; break;
case 'x': case 'X': base = 16; sign = 0; break;
case 's':
for (str = va_arg(ap, char *); *str; str++)
BSP_output_char(*str);
break;
case 'c':
BSP_output_char(va_arg(ap, char));
break;
default:
BSP_output_char(c);
break;
} /* switch*/
if (base)
printNum(lflag ? va_arg(ap, long int) : (long int)va_arg(ap, int),
base, sign);
}
else
{
BSP_output_char(*fmt);
}
}
va_end(ap); /* clean up when done */
_CPU_ISR_Enable(level);
} /* printk */