⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于s3c2440的U盘读写程序
💻 C
字号:
#define GLOBAL_CLK
#include  "base.h"
#include	"2440lib.h"
#include "option.h"

extern int s_usbhost_reset(void);//"reset - reset (rescan) USB controller\n"
extern int s_usbhost_start(void);
extern int s_usbhost_stop(void);//"usb stop [f]  - stop USB [f]=force stop\n"
extern int s_usbhost_tree(void);//"usb tree  - show USB device tree\n"
extern int s_usbhost_scan(void);
//extern int s_usbhost_stor(void);//"usb storage  - show details of USB storage devices\n"
extern int s_usbhost_part(void);//"usb part [dev] - print partition table of one or all USB storage devices\n"
extern int s_usbhost_info(int argc, char *argv[]);//"usb info [dev] - show available USB devices\n"
extern int s_usbhost_read(unsigned long rblk,unsigned long rcnt,unsigned char *rbuffer);//usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'
//to memory address `addr'\n"
extern int s_usbhost_dev(int dev);//"usb dev [dev] - show or set current USB storage device\n"
extern void TestWaitMs(void);
/*=======================================
	"fatls   - list files in a directory (default /)\n",
    =======================================*/
extern int do_fat_ls (const char *pathandfilename);
/*=======================================
	"fatinfo - print information about filesystem\n",
   ========================================*/
extern int do_fat_fsinfo (void);
/*========================================
	"fatload - load binary file from a dos filesystem\n",
    ========================================*/
extern int do_fat_fsload (const char *filename,unsigned char *buffer,unsigned long addr,unsigned long count);

static void cal_cpu_bus_clk(void);
void DelayMs(unsigned short ms)
{
    int i,j;
    for(i=0;i<ms;i++)
    for(j=0;j<51000;j++);//75000=1.4ms 50000=986us
}


static U32 cpu_freq;
static U32 UPLL;
static void cal_cpu_bus_clk(void)
{
	U32 val;
	U8 m, p, s;
	
	val = rMPLLCON;
	m = (val>>12)&0xff;
	p = (val>>4)&0x3f;
	s = val&3;

	//(m+8)*FIN*2 不要超出32位数!
	FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;
	
	val = rCLKDIVN;
	m = (val>>1)&3;
	p = val&1;	
	val = rCAMDIVN;
	s = val>>8;
	
	switch (m) {
	case 0:
		HCLK = FCLK;
		break;
	case 1:
		HCLK = FCLK>>1;
		break;
	case 2:
		if(s&2)
			HCLK = FCLK>>3;
		else
			HCLK = FCLK>>2;
		break;
	case 3:
		if(s&1)
			HCLK = FCLK/6;
		else
			HCLK = FCLK/3;
		break;
	}
	
	if(p)
		PCLK = HCLK>>1;
	else
		PCLK = HCLK;
	
	if(s&0x10)
		cpu_freq = HCLK;
	else
		cpu_freq = FCLK;
		
	val = rUPLLCON;
	m = (val>>12)&0xff;
	p = (val>>4)&0x3f;
	s = val&3;
	UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
	if(UPLL==96*MEGA)
		rCLKDIVN |= 8;	//UCLK=UPLL/2
	UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;

}


void u2440mon_main(void)
{
		char *mode;
	int i;
	U8 key;
	U32 mpll_val, divn_upll=0;
    
	/*
	#if ADS10   
	__rt_lib_init(); //for ADS 1.0
	#endif
*/
	Port_Init();
	rGPACON &= ~(1<<11);
	rGPADAT |= 1<<11;
	// USB device detection control
/*	rGPGCON &= ~(3<<24);
	rGPGCON |=  (1<<24); // output
	rGPGUP  |=  (1<<12); // pullup disable
	rGPGDAT |=  (1<<12); // output	
*/	//masked by hzh

	//ChangeUPllValue(60,4,2);		// 48MHz
	//for(i=0; i<7; i++);
	//ChangeClockDivider(13,12);
	//ChangeMPllValue(97,1,2);		//296Mhz
	
/*
#if (FCLK==271500000)
	ChangeClockDivider(13,12);	//hzh
	ChangeMPllValue(173,2,2);	//271.5Mhz,2440A!
#elif (FCLK==304800000)
	ChangeClockDivider(13,12);	//hzh
	ChangeMPllValue(68,1,1);	//304.8MHz,2440A!
#elif (FCLK==200000000)
	ChangeMPllValue(92,4,1);	//200MHz,2440A!
	ChangeClockDivider(12,12);	//hzh
#elif (FCLK==240000000)
	ChangeClockDivider(13,12);	//hzh
	ChangeMPllValue(52,1,1);	//240MHz,2440A!
#elif (FCLK==300000000)
	ChangeClockDivider(14,11);	//hzh
	ChangeMPllValue(67,1,1);	//304.8MHz,2440A!
#elif (FCLK==320000000)
	ChangeClockDivider(14,11);	//hzh
	ChangeMPllValue(72,1,1);	//320MHz,2440A!
#elif (FCLK==330000000)
	ChangeClockDivider(14,11);	//hzh
	ChangeMPllValue(157,4,1);	//330MHz,2440A!
#elif (FCLK==340000000)
	ChangeClockDivider(14,11);	//hzh
	ChangeMPllValue(77,1,1);	//340MHz,2440A!
#elif (FCLK==350000000)
	ChangeClockDivider(14,11);	//hzh
	ChangeMPllValue(167,4,1);	//350MHz,2440A!
#elif (FCLK==360000000)
	ChangeClockDivider(14,12);	//hzh
	ChangeMPllValue(82,1,1);	//360MHz,2440A!
#elif (FCLK==380000000)
	ChangeClockDivider(14,12);	//hzh
	ChangeMPllValue(87,1,1);	//380MHz,2440A!
#elif (FCLK==400000000)
	ChangeClockDivider(14,12);	//hzh
	ChangeMPllValue(92,1,1);	//400MHz,2440A!
#endif
*/
	
	//Isr_Init();
	
	//Led_Test();

	//i = search_params();	//hzh, don't use 100M!
	switch (2) {
//	switch(1) {
	case 0:	//240
		key = 14;
		mpll_val = (112<<12)|(4<<4)|(1);
		break;
	case 1:	//320
		key = 14;
		mpll_val = (72<<12)|(1<<4)|(1);
		break;
	case 2:	//400
		key = 14;
		mpll_val = (92<<12)|(1<<4)|(1);
		break;
	case 3:	//440!!!
		key = 14;
		mpll_val = (102<<12)|(1<<4)|(1);
		break;
	default:
		key = 14;
		mpll_val = (92<<12)|(1<<4)|(1);
		break;
	}
#if 1
	//init FCLK=400M, so change MPLL first
	ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
	ChangeClockDivider(key, 12);
	cal_cpu_bus_clk();
	if(PCLK<(40*MEGA)) {
		ChangeClockDivider(key, 11);
		cal_cpu_bus_clk();
	}
#else
	cal_cpu_bus_clk();
#endif

	//consoleNum=boot_params.serial_sel.val&0;	// Uart 1 select for debug.
	Uart_Init(0,112500);//boot_params.serial_baud.val);
	//Uart_Select(consoleNum);
}
int Main(void)
{
    char cmd;
    char tempbuf[10][100];
    char temppath[1000];
    unsigned char buffer[10000];
    int i,ret;
    unsigned long len;
	// s_UartInit();	//du add 2007.2.10
	u2440mon_main();
	//Uart_Printf("          S3C2440 Bootloader V2006\n");
	
	s_UartPrint("\nUCLK=%d \n",UCLK);
	s_UartPrint("\nUPLL=%d \n",UPLL);
	s_UartPrint("\nrUPLLCON=%0x \n",rUPLLCON);
	
	rGPBCON=rGPBCON&(~0x3ff00)|(0x15500);
	rGPBDAT&=~(1<<5);
	rGPBDAT&=~(1<<8);
	rGPBDAT|=(1<<6);
	rGPBDAT|=(1<<7);
	
    memset(tempbuf,0,sizeof(tempbuf));

	// s_UartInit();	//du add 2007.2.10
    //s_UartPrint("P78 welcome you!\n");
    //rBWSCON = 0x01022202;//set lcd and sram databus width
    //rGPECON &= ~(3<<8);
    //rGPECON |= (1<<8);
    //rGPEDAT &= ~(1<<4);
	//rGPEUP  &= ~(1<<4);

	//=======du add
	s_usbhost_reset();
	//===================
    s_UartPrint("Usb Host Test!\n");
    s_TimerInit();
    /*
	s_UartPrint("---------------------\n");
    s_UartPrint("1-Start  2-Stop   3-Tree \n");
    s_UartPrint("4-Scan   5-Stor   6-Part \n");
    s_UartPrint("7-Info   8-Read   9-Dev \n");
    s_UartPrint("l-List   i-fsinfo r-read   \n");
    s_UartPrint("---------------------\n");
*/
    while(1)
    {
         s_UartPrint("---------------------\n");
    s_UartPrint("1-Start  2-Stop   3-Tree \n");
    s_UartPrint("4-Scan   5-Stor   6-Part \n");
    s_UartPrint("7-Info   8-Read   9-Dev \n");
    s_UartPrint("l-List   i-fsinfo r-read   \n");
    s_UartPrint("---------------------\n");
		
		s_UartPrint("\nPlease Select Function Key:\n");
        cmd=s_getkey();
        s_UartPrint("\n");
        switch(cmd)
        {
        case '1':
            s_UartPrint("s_usbhost_start() \n");
            s_usbhost_start();
            break;
        case '2':
            //s_UartPrint("s_usbhost_stop() \n");
            //s_usbhost_stop();
            s_UartPrint("s_usbhost_dev(2, tempbuf) \n");
            s_usbhost_read(2,8,buffer);
            break;
        case '3':
            s_UartPrint("s_usbhost_tree() \n");
            s_usbhost_tree();
            break;
        case '4':
            s_UartPrint("s_usbhost_scan() \n");
            s_usbhost_scan();
            break;
        case '5':
            s_UartPrint("s_usbhost_stor() \n");
            //s_usbhost_stor();
            break;
        case '6':
            s_UartPrint("s_usbhost_part() \n");
            s_usbhost_part();
            break;
        case '7':
            s_UartPrint("s_usbhost_info(2, tempbuf) \n");
            //s_usbhost_info(2, tempbuf);
            break;
        case '8':
            s_UartPrint("s_usbhost_read(5, tempbuf) \n");
            s_usbhost_dev(0);
            s_usbhost_read(0,1,buffer);
            //s_usbhost_read(8,8,buffer);
            //s_usbhost_read(16,8,buffer);
            //s_usbhost_read(24,8,buffer);
            //s_usbhost_read(32,8,buffer);
            break;
        case '9':
            s_UartPrint("s_usbhost_dev(0, tempbuf) \n");
            s_usbhost_dev(0);
            break;
        case '0':
            s_UartPrint("s_usbhost_dev(1, tempbuf) \n");
            s_usbhost_read(1,8,buffer);
            break;
        case 'l':
        case 'L':
            s_UartPrint("do_fat_ls () \n");
            memset(temppath,0,sizeof(temppath));
            strcpy(temppath,"\\");
            do_fat_ls (temppath);
            break;
        case 'i':
        case 'I':
            s_UartPrint("do_fat_fsinfo() \n");
            do_fat_fsinfo ();
            break;
        case 'r':
        case 'R':
			//===========
			

			//===========
           s_UartPrint("do_fat_fsload(0,5) \n");
            ret=do_fat_fsload ("readme.txt",buffer,0,5);			
           s_UartPrint("ret=%d \n",ret);
            s_UartPrint("do_fat_fsload(5,15) \n");
            ret=do_fat_fsload ("readme.txt",buffer,5,15);
            s_UartPrint("ret=%d  \n",ret);
            
            break;
        }
    }
    return 0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -