www.pudn.com > bu1566.rar > main.c


/****************************************Copyright (c)************************************************** 
**--------------File Info------------------------------------------------------------------------------- 
** File name:			main.c 
** Last modified Date:  2007-04-16 
** Last Version:		1.0 
** Descriptions:		The main() function example template 
 
********************************************************************************************************/ 
#include "config.h" 
#include "stdlib.h" 
#include "BUxx_Sample.h" 
#include "BUxx_aDSC.h" 
#include "BUxx_Main.h" 
#include  "main.h" 
#include "I2C.h" 
#include "zlg7290.h" 
#include  "target.h" 
#include  "UART0.h" 
#include  "lcddrive.h" 
 
#include  "UART0.h" 
#include  "hpi32.h" 
#include  "fat32.h" 
 
 
#define   KEY1       1<<20	         // 定义按键 
#define   HcRECT   (1<<10)           // FOR RESET 
#define   UART_BPS  115200           // 定义通讯波特率 
#define   ZLG7290 0x70               // 定义器件地址 
#define	BEEP	(1 << 7)            /* P0.07为蜂鸣器 */ 
#define   KEY_INT  1<<30           // 定义p0.30为 按键中断 
 
#define   LEDCON   0xf0000000 
char      SendBuf[16];      
 
UINT32 jpeg_size = JPEG_BUFFER;              //定义最大JPEG尺寸_     
//UINT16 * start_add = (UINT16 *) 0x80400000;  //定义放置DATA的起始地址 
static UINT16  start_add[1024*100]; 
 
#define ARMMJPEG_BUFFER	(256*1024) 
UINT32 ARMmjsize = ARMMJPEG_BUFFER; 
 
 
#define	TaskStkLengh	512			//Define the Task0 stack length 定义用户任务0的堆栈长度  
#define TASK_STK_SIZE  128 
 
#define CMD_SD_INIT		   0x00				/* 卡初始化卡命令  */ 
#define CMD_SD_READ    	   0x01				/* 卡读命令        */ 
#define CMD_SD_WRITE   	   0x02				/* 卡写命令        */ 
#define CMD_SD_ERASE	   0x03				/* 卡擦除命令      */ 
 
#define CMD_DATA_TRANS	   0x04				/* 将sd_buf中的数据发送到PC机 */ 
#define CMD_DATA_RECV	   0x05				/* 接收来自串口的数据,并放入sd_buf中 */ 
 
/* SD/MMC卡读写缓冲区,比SDMMC卡一个块大8字节 */   
uint8 sd_buf[520]; 
 
OS_STK  TaskStartStk[TASK_STK_SIZE];  
OS_STK	TaskStk0[TaskStkLengh];		//Define the Task0 stack 定义用户任务0的堆栈 
OS_STK	TaskStk1[TaskStkLengh];		//Define the Task1 stack 定义用户任务1的堆栈 
OS_STK	TaskStk2[TaskStkLengh];		//Define the Task2 stack 定 
 
OS_STK   TaskStk[TASK_STK_SIZE];			/* 任务堆栈 */ 
 
 
OS_STK	Task0Stk [TaskStkLengh];    // 定义用户任务0的堆栈 
OS_STK	Task1Stk [TaskStkLengh];    // 定义用户任务1的堆栈 
 
OS_STK   TaskCardStk[TASK_STK_SIZE];		/* 卡操作任务堆栈 */ 
OS_EVENT *Uart0ReviceMbox;					/* 串口接收数据邮箱 */ 
 
void 	Task0(void *pdata);			// 任务0 
 
extern void C_Entry(void); 
extern void  __irq aDSC_int_disp(void); 
extern void  UART0SendStr(char *str); 
 
/**************************************************************************** 
* 名    称:main() 
****************************************************************************/ 
 
int main(void) 
{   
    // UINT8 Key = 0; 
     //UINT8 init_once = 0; 
     char *start = "WELCOME";                     //write Frame jpeg     
     //static UINT16 start_add[100*1024];  
    
     /************************ 初始化SD card  *************************/  
     UINT8 *pRec; 
     UINT8 err; 
     UINT32 bufaddr,blockaddr,blocknum; 
     uint16 temp;  
	 
   //  pdata = pdata;  
     /************************ 初始化中断  *************************/ 
     PINSEL0 = 0x00000000;                         // 设置管脚连接GPIO  
     PINSEL1 = 0x00000000; 
 
   /************************ 初始化DSP  *************************/  
       Reset_BU1566();                 //Reset BU1566 
 
     // INIT_BU1566();                  //BU1566 中断设定    
                                 /* 目标板初始化 */ 
   /******************* 初始化LCD and CAM  初始化串口************/         
       GUI_Initialize();                   // 初始化ARM 上的 LCD  
      
       C_Entry();                             // 初始化屏,刷BU1566屏红蓝色   
       
       sStartPreview();       
    /*******************  初始化串口************/ 
       UART0Init(115200);                 // 初始化UART0 为打印日期用的 
       Time0Init();				     // 初始化定时器0 为测试串口用 
 
  /******************* CMD_SD_INIT  初始化************/	       
    temp = SD_Initialize();				/* 初始化SD卡 */ 
//	EnumSdDev(); //读取sd卡系统信息    
//	CreateFile(0,"abcdef.jpg",0);//创建文件,文件名为8位 
 
    sJPEGCEncode((UINT16 *) start_add, 19); 
    
//	WriteFile(len,ubuf);//写数据,len=数据长度,ubuf=数据	 
 
     sJPEGDecode((UINT16 *) start_add,&jpeg_size);	 
 
			 
} 
 
  
/**************************************************************************** 
* 名    称:Reset_BU1566() 
* 功    能:reset BU1566 
* 入口参数:无 
* 出口参数:无PINSEL0 &=~((0x3<<20)|(0xA<<0)); 
****************************************************************************/  
void Reset_BU1566(void) 
{ 
    UINT8 i; 
    PINSEL0 &=~(0x3<<20);                   // 设置管脚po.10为连接GPIO输出 
    IO0DIR |= HcRECT;	                    // 设置 P0.10为I/O为输出 
 
   //直接写以下设定P0.10为输出也可 
    //  IO0PIN = HcRECT; 
   
     IO0SET = HcRECT;				        // BEEPCON = 1 
	 for(i =0; i < 40; i ++); 
     IO0CLR = HcRECT;				        // BEEPCON = 0 
	 for(i =0; i < 40; i ++);	 
     IO0SET = HcRECT;	 
	 for(i =0; i < 40; i ++);               // BEEPCON = 1 
 
}  
 
/**************************************************************************** 
* 名    称:INIT_BU1566() 
* 功    能:BU1566的中断。  
* 入口参数:无 
* 出口参数:无 
****************************************************************************/ 
void INIT_BU1566(void) 
{ 
    //p0.16 INT pin 
   // PINSEL0 &=~(0xA<<0);                 // 设置管脚连接GPIO ,设置I/O连接到UART0  
   // PINSEL0 |= 0x00000005;                 // 设置管脚连接GPIO ,设置I/O连接到UART0      
    
    PINSEL1 |= 0x00000001;                 // 设置管脚连接,P0.16设置为EINT0 
    EXTMODE = 0x0f;		                   // 设置EINT0中断为边沿触发模式  
    EXTPOLAR = 0x00;                       //下降沿有或低电平 
 
    //为直接设定通道数,如spi为10=A 
    VICVectCntl7 = (0x20|0x0E);            // 设置EINT0分配到IRQslot1 
     
    VICVectAddr1 = (int) aDSC_int_disp;	   // 设置中断服务程序地 址 
     
    VICIntEnable = 1<<14;		    	   // 使能EINT0中断,EINT0在Bit14上 
 //   VICIntEnable = 0x00004000;           //使能EINT0中断,EINT0在Bit14 
 } 
 
/**************************************************************************** 
* 名    称:Time0Init() 
* 功    能:初始化定时器0,定时时间为1S。  
* 入口参数:无 
* 出口参数:无 
****************************************************************************/ 
void TimeSendLCD(void)	 
{ 
   
    uint32 times, hour, min, sec; 
    char szTime[10]; 
 
     
    while( 0==(ILR&0x01) );       	// 等待RTC增量中断标志 
    ILR = 0x01;				    	// 清除中断标志 
 
    times = CTIME0; 
     
    hour = 0x1F & (times>>16); 
    min  = 0x3F & (times>>8); 
    sec  = 0x3F & (times); 
    szTime[0] = '0' + (hour/10); // '0' + 1 = '1' 
    szTime[1] = '0' + (hour%10); 
    szTime[2] = ':'; 
    szTime[3] = '0' + (min/10); 
    szTime[4] = '0' + (min%10); 
    szTime[5] = ':'; 
    szTime[6] = '0' + (sec/10); 
    szTime[7] = '0' + (sec%10); 
    szTime[8] = 0;	//	end flag of string 
     
     
    SendTimeRtc();            // 读取时钟值,并向UART0发送 
     
    aDRT_clear(0, 0, M_LCD_WSIZE, M_LCD_HSIZE, 0xf800 );	 
    aDRT_write_string(szTime,2, 20, 40); 
             
 } 
 
 
/**************************************************************************** 
* 名    称:Time0Init() 
* 功    能:初始化定时器0,定时时间为1S。  
* 入口参数:无 
* 出口参数:无 
****************************************************************************/ 
void  Time0Init(void) 
{   /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz 
	   Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz 
	*/ 
    T0PR = 99;			    					// 设置定时器0分频为100分频,得110592Hz 
	T0MCR = 0x03;		   						// 匹配通道0匹配中断并复位T0TC 
	T0MR0 = 552960;	    						// 比较值(1S定时值) 
	T0TCR = 0x03;		   						// 启动并复位T0TC 
	T0TCR = 0x01;  
} 
 
 
/**************************************************************************** 
* 名    称:UART0_SendByte() 
* 功    能:向串口发送字节数据,并等待发送完毕。 
* 入口参数:data		要发送的数据 
* 出口参数:无 
****************************************************************************/ 
void  UART0_SendByte(uint8 data) 
{   
    U0THR = data;				    	// 发送数据 
     
    while( (U0LSR&0x40)==0 );	    	// 等待数据发送完毕 
} 
 
/**************************************************************************** 
* 名    称:UART0_SendStr() 
* 功    能:向串口发送一字符串 
* 入口参数:srt		要发送的字符串的指针 
* 出口参数:无 
****************************************************************************/ 
void  UART0_SendStr(uint8 const *str) 
{   
    while(1) 
    {   
        if( *str == '\0' ) break; 
        UART0_SendByte(*str++);	    	// 发送数据 
    } 
} 
 
/**************************************************************************** 
* 名    称:Time_INIT() 
* 功    能:定时器。  
* 入口参数:无 
* 出口参数:无 
****************************************************************************/ 
 void Time_INIT(void) 
 { 
  
       while( (T0IR&0x01) == 0 );	  // 等待定时时间到 
       T0IR = 0x01; 
} 
 
 
 
/********************************************************************************************************* 
** 函数名称: TaskStart 
** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务 
********************************************************************************************************/ 
        void  TaskCard(void *pdata) 
{ 
    uint8 *pRec; 
    uint8 err; 
	uint32 bufaddr,blockaddr,blocknum; 
	 
    pdata = pdata;                                                     /* 避免编译警告 */ 
 
    Uart0ReviceMbox = OSMboxCreate(NULL);                              /* 建立邮箱 */ 
    if (Uart0ReviceMbox == NULL) 
        while (1); 
 
   
    TargetInit();                                                      /* 目标板初始化 */ 
    for (;;) 
    { 
        pRec = (uint8 *)OSMboxPend(Uart0ReviceMbox, 0, &err);          /* 接收数据 */ 
        switch(pRec[0]) 
    	{ 
    		case CMD_SD_INIT: pRec[1] = SD_Initialize();			   /* 初始化SD卡 */ 
    		break;  
    		 
    		case CMD_SD_READ: 
    			 blockaddr = (pRec[1] << 24) + (pRec[2] << 16) +	   /* 计算块地址 */ 
    						 (pRec[3] << 8) + pRec[4]; 
    			 pRec[1] = SD_ReadBlock(blockaddr, sd_buf);		 	   /* SD卡单块读 */ 			 
    		break; 
    		 	    		 
    		case CMD_SD_WRITE:	  
    			 blockaddr = (pRec[1] << 24) + (pRec[2] << 16) +  
    						 (pRec[3] << 8) + pRec[4]; 
    			 pRec[1] = SD_WriteBlock(blockaddr, sd_buf);		   /* SD 卡单块写 */ 
    		break; 
    			 
    		case CMD_SD_ERASE:	  
    			 blockaddr = (pRec[1] << 24) + (pRec[2] << 16) +  
    						 (pRec[3] << 8) + pRec[4];				   /* 擦卡起始地址 */ 
    			 blocknum  = (pRec[5] << 16) + (pRec[6] << 8) +	 
    				 		 (pRec[7]);								   /* 块数 */ 
    			 pRec[1] = SD_EraseBlock(blockaddr, blocknum);		   /* 擦除操作 */ 
    		break; 
   			 
    		case CMD_DATA_RECV:	  
    			 bufaddr = (pRec[1] << 8) + pRec[2];				   /* 计算缓冲区地址 */ 
    			 memcpy(sd_buf + bufaddr, &pRec[3], 5);				   /* 收到数据放入pRec */ 
    		break; 
    			 
    		case CMD_DATA_TRANS:  
    			 bufaddr = (pRec[1] << 8) + pRec[2];				   /* 计算缓冲区地址 */  
    			 memcpy(&pRec[1], sd_buf + bufaddr, 7);				   /* sd_buf数据放入pRec */ 
    		break;  							 
    	 
    		default: break; 
    	} 
    	 
    	UART0Write(pRec, 8);		/* 发送响应帧 */ 
    } 
}