?? hms7202lib.c
字號:
#include "reg7202.h"
#include "utils.h"
#include "ddscommand.h"
static int ser0_open();
static int ser1_open();
static unsigned char serial0_inb(int);
static unsigned char serial1_inb(int);
static void interrupt_init();
static void keyboard_init();
static void lcd_init();
static void pll_init();
static void ser0_close();
static void ser1_close();
static void set_gpio_pin();
static void ser0_putchar(char);
static void ser1_putchar(char);
int f_nDelayLoopCount;
/****************************************************************/
/* set the Programmable Input /Output module (PIO) */
/****************************************************************/
static void set_gpio_pin()
{
/****************************************************************/
/* set port a ***********/
/****************************************************************/
*(volatile unsigned short *)PioAmuxctl =0x0000;
*(volatile unsigned short *)PioAmuxsel =0x0000;
*(volatile unsigned short *)PioADDR =0xff00;//置位則設置為輸入口
*(volatile unsigned short *)PioADR =0xffff;//數據寄存器
*(volatile unsigned short *)PioAIM =0x0000;//置位則設置相應引腳為中斷源
*(volatile unsigned short *)PioAIS =0x0000;//無中斷
*(volatile unsigned short *)PioAIE =0x0000;//設置為電平觸發模式
*(volatile unsigned short *)PioAIC =0xffff;//清除中斷掛起位
*(volatile unsigned short *)PioAIP =0xffff;//低電平有效
/****************************************************************/
/* set port b ***********/
/****************************************************************/
*(volatile unsigned short *)PioBmuxctl =0x000;
*(volatile unsigned short *)PioBDDR =0x035;
*(volatile unsigned short *)PioBDR =0xfff;
*(volatile unsigned short *)PioBIM =0x000;
*(volatile unsigned short *)PioBIS =0x000;
*(volatile unsigned short *)PioBIE =0x000;
*(volatile unsigned short *)PioBIC =0xfff;
*(volatile unsigned short *)PioBIP =0xfff;
/****************************************************************/
/* set port c ***********/
/****************************************************************/
*(volatile unsigned short *)PioCmuxctl =0x000;
*(volatile unsigned short *)PioCDDR =0x084;
*(volatile unsigned short *)PioCDR =0x7ff;
*(volatile unsigned short *)PioCIM =0x000;
*(volatile unsigned short *)PioCIS =0x000;
*(volatile unsigned short *)PioCIE =0x000;
*(volatile unsigned short *)PioCIC =0x7ff;
*(volatile unsigned short *)PioCIP =0x7ff;
/****************************************************************/
/* set port d ***********/
/****************************************************************/
*(volatile unsigned short *)PioDmuxctl =0x000;
*(volatile unsigned short *)PioDDDR =0x000;
*(volatile unsigned short *)PioDDR =0x1ff;
*(volatile unsigned short *)PioDIM =0x000;
*(volatile unsigned short *)PioDIS =0x000;
*(volatile unsigned short *)PioDIE =0x000;
*(volatile unsigned short *)PioDIC =0x1ff;
*(volatile unsigned short *)PioDIP =0x1ff;
/****************************************************************/
/* set port e ***********/
/****************************************************************/
/****************************************************************
PE0 PE1 PE2 PE3 PE4 PE5 PE6 PE7 PE8 PE9 PE10 PE11 PE12
RD16 RD17 RD18 RD19 RD20 RD21 RD22 RD23 RD24 RD25 RD26 RD27 RD28
PE13 PE14 PE15 PE16 PE17 PE18 PE19 PE20 PE21 PE22 PE23 PE24
RD29 RD30 RD31 nRW2 nRW3 SSDI ZERO SSDO pul1 pul2 RA24*/
/*PE22 PE23作為旋鈕中段信號輸入線,上升沿有效*/
*(volatile unsigned *)PioEmuxctl =0x0c00000;
*(volatile unsigned *)PioEDDR =0x0c00000;
*(volatile unsigned *)PioEDR =0x0000000;
*(volatile unsigned *)PioEIM =0x0c00000;
*(volatile unsigned *)PioEIS =0x0000000;
*(volatile unsigned *)PioEIE =0x0c00000;
*(volatile unsigned *)PioEIC =0x1ffffff;
*(volatile unsigned *)PioEIP =0x13fffff;
*(volatile unsigned char *)PioSwap =0x0;
*(volatile unsigned char *)PioTictMDR =0x0;
}
static void pll_init()
{
int val;
val = _inw(PmuClkCtl);
// _outw(PmuClkCtl, val | PmuPLL1En | PmuPLL2En );
_outw(PmuClkCtl, val | PmuPLL1En | PmuPLL2En | PmuPLL3Mute);
// for(val=0; val< 0xf0000;val++); // delay
}
/* Register Offset */
#define SERIAL_THR 0
#define SERIAL_RBR 0
#define SERIAL_DLL 0
#define SERIAL_DLM 0x04
#define SERIAL_IER 0x04
#define SERIAL_IIR 0x08
#define SERIAL_FCR 0x08
#define SERIAL_LCR 0x0C
#define SERIAL_MCR 0x10
#define SERIAL_LSR 0x14
#define SERIAL_MSR 0x18
#define SERIAL_SCR 0x1c
#define DEBUG_PORT_LEVEL 8
typedef enum {
tty_baud1200,
tty_baud2400,
tty_baud4800,
tty_baud9600,
tty_baud19200,
tty_baud38400,
tty_baud57600,
tty_baud115200,
tty_baud230400
} tty_baud_t;
int baud_data[] = {
192, // tty_baud1200
96, // tty_baud2400
48, // tty_baud4800
24, // tty_baud9600
12, // tty_baud19200
6, // tty_baud38400
4, // tty_baud57600
2, // tty_baud115200
1 // tty_baud230400
};
typedef enum {TEXT_MODE, BINARY_MODE } ser_mode_t;
static int ser0_opened = 0;
static int ser1_opened = 0;
static ser_mode_t ser_mode = TEXT_MODE;
static unsigned int ser_base = UART0_BASE;
static unsigned int ser_level = DEBUG_PORT_LEVEL;
static tty_baud_t cur_baud = tty_baud38400;
static unsigned char serial0_inb(int offset)
{
unsigned char ch= _inb(UART0_BASE + offset);
return ch;
}
static unsigned char serial1_inb(int offset)
{
unsigned char ch= _inb(UART1_BASE + offset);
return ch;
}
static int ser0_open()
{
if(ser0_opened) return 0;
ser_base = UART0_BASE;//0x80020000 Uart0
ser_level = DEBUG_PORT_LEVEL;//0x8
cur_baud = tty_baud38400;
_outb(ser_base+0x30,1);//使能UART0
_outw(0x8002301c, 0x0);
_outw(0x800230A4, 0x0);//
_outb(ser_base+SERIAL_LCR,0x80);//置位 DLAB
_outb(ser_base+SERIAL_DLL,baud_data[cur_baud]);
_outb(ser_base+SERIAL_DLM,0x0);//設置波特率.DLL=4,即波特率=57600
_outb(ser_base+SERIAL_LCR,0x03);//DLAB 清0,8位字長,1_stop,無奇偶校驗
_outb(ser_base+SERIAL_FCR,0x01);//使能FIFO
_outb(ser_base+SERIAL_IER,0x00);//禁止UART中斷
_outb(ser_base+SERIAL_MCR,0x03);//使NRTS和NDTR信號輸出為0,nUDTR和nURTS信號輸出為0
//即UART已準備好接收和發送
ser0_opened = 1;
return 1;
}
static int ser1_open()
{
if(ser1_opened) return 0;
ser_base = UART1_BASE;//0x80021000 Uart1
ser_level = DEBUG_PORT_LEVEL;//0x8
cur_baud = tty_baud38400;
_outb(ser_base+0x30,1);//使能UART1
_outw(0x8002301c, 0x0);//AEn=0,KSCANI/O
_outw(0x800230A4, 0x0);//AMULSEL=0,GPIO
_outb(ser_base+SERIAL_LCR,0x80);//置位 DLAB
_outb(ser_base+SERIAL_DLL,baud_data[cur_baud]);
_outb(ser_base+SERIAL_DLM,0x0);//設置波特率.DLL=4,即波特率=38400
_outb(ser_base+SERIAL_LCR,0x03);//DLAB 清0,8位字長,1_stop,無奇偶校驗
_outb(ser_base+SERIAL_FCR,0x01);//使能FIFO
_outb(ser_base+SERIAL_IER,0x00);//禁止UART中斷
_outb(ser_base+SERIAL_MCR,0x03);//使NRTS和NDTR信號輸出為0,nUDTR和nURTS信號輸出為0
//即UART已準備好接收和發送
ser1_opened = 1;
return 1;
}
static void ser0_close()
{
ser0_opened = 0;
}
static void ser1_close()
{
ser1_opened = 0;
}
#include <string.h>
#include <stdarg.h>
char ser0_getchar()
{
char ch;
int lsr;
if(ser0_opened == 0)
return -1;
do {
lsr = (int) serial0_inb(SERIAL_LSR);
}while( (lsr&0x1) != 0x1);
ch = serial0_inb(SERIAL_RBR);
return ch;
}
static void ser0_putchar(char ch)
{
int lsr;
if(ser0_opened == 0)
return;
do {
lsr = serial0_inb(SERIAL_LSR);
}while( (lsr&0x60) != 0x60);
_outb(UART0_BASE+SERIAL_THR,ch);
if(ser_mode == TEXT_MODE && ch == '\n')
_outb(UART0_BASE+SERIAL_THR,'\r');
}
static void ser1_putchar(char ch)
{
int lsr;
if(ser1_opened == 0)
return;
do {
lsr = serial1_inb(SERIAL_LSR);
}while( (lsr&0x60) != 0x60);
_outb(UART1_BASE+SERIAL_THR,ch);
}
int ser_printf(const char *format, ...)
{
char buff[256];
int chars, i;
va_list ap;
va_start(ap, format);
chars = vsprintf(buff, format, ap);
va_end(ap);
i = 0;
while (buff[i])
ser0_putchar(buff[i++]);
return 0;
}
void delay(int nTime)
{
int nAdjust;
int i;
nAdjust = 0;
if(nTime == 0)
{
nTime = 200;
nAdjust = 1;
f_nDelayLoopCount = 400;
//rWTCON = ((MCLK/1000000-1)<<8)|(2<<3); // 1M/64, Watch-dog, nRESET, interrupt disable
*((volatile char *)TM0_CTRL) = 0x4;//stop count,reset counter register
*((int *)TM0_BASE) = 0xffffffff;//溢出值設為最大
*((volatile char *)TM0_CTRL) = 0x1;//開始計數
}
for(; nTime>0; nTime--)
{
for(i=0; i<f_nDelayLoopCount; i++)
;
}
if(nAdjust==1)
{
*((volatile char *)TM0_CTRL) = 0x0;//停止計數
i =*((volatile int *)TM0_COUNT);//讀取計數值
f_nDelayLoopCount = 3686400*8/i;
}
}
static void interrupt_init(void)
{
/*
add interrupt init code here;
*/
}
static void keyboard_init(void)
{
//設置PORTA管腳功能
*(volatile unsigned short *)PioAmuxctl =0x0000;
*(volatile unsigned short *)PioAmuxsel =0x0000;
*(volatile unsigned short *)PioADDR =0xff00;//置位則設置為輸入口
//將中斷服務程序入口地址放入中斷向量寄存器中
//pISR_KBD = (unsigned int)Key_IsrCode;
//開鍵盤中斷
//*(volatile unsigned int *)IntEnR |= 0x1000;
//設置掃描頻率
*(volatile unsigned char*)KBCr &= 0xfc;
*(volatile unsigned char*)KBCr |=0x03;
//開始鍵盤掃描
*(volatile unsigned char*)KBCr |= (KbScnStart + KbPwrUp);
}
static void lcd_init(void)
{
/*
add lcd display init code here;
*/
}
void system_init(void)
{
set_gpio_pin();
pll_init();
delay(0);
interrupt_init();
ser0_open();
ser1_open();
keyboard_init();
lcd_init();
}
void FrameHead_Send(FRAME_HEAD_t * p)
{
int i;
ser1_putchar(0x7f);
ser1_putchar(0xfe);
ser1_putchar(p->m_WWaveType);
ser1_putchar(p->m_WDataLen & 0xff);
ser1_putchar(p->m_WDataLen>>8 & 0xff);
ser1_putchar(p->m_WFrameCount);
ser1_putchar(p->m_WFrameIndex);
ser1_putchar(p->m_WFreMode);
for(i=0;i<6;i++) ser1_putchar(p->m_WFrequency[i]);
}
void FrameData_Send(char *p, int size)
{
int i;
for(i=0;i<size;i++)
ser1_putchar(*p++);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -