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

📄 fmd.c.bak

📁 在PXA270主板上
💻 BAK
字号:

#include "bvd1.h"

#include <bulverde_base_regs.h>
#include <xllp_defs.h>
#include <xllp_ost.h>
#include <xllp_keypad.h>
#include <xllp_clkmgr.h>
#include <xllp_gpio.h>
#include <stdlib.h>


XLLP_GPIO_T *v_pGPIOReg  = NULL;

// set the debug flag for IO space or memory space
#define DEBUG_IO 	0
#define NO_EIGHT	0	// 1: only 16-bit rw; 0: only 8-bit rw

#define LOGIC_EIGHT	1	// 1: logic 8-bit rw; 0: real 8-bit

typedef unsigned char UCHAR;
typedef unsigned int UINT;
typedef unsigned short USHORT;

//
UCHAR dat[512]; //dat[]存放一个扇区的数据
volatile USHORT dat_16[256];
//read and write flag
UINT write_flag_err_1=0;
UINT write_flag_err_2=0;

UINT read_flag_err_1=0;
UINT read_flag_err_2=0;

P_XLLP_OST_T g_pOstRegs = (P_XLLP_OST_T)(0x40A00000);

// 
// XllpOstDelayTicks
//
// Delay the number of ticks specified using the OST OSCR0 clock.
//
// Inputs:
//   pOstRegs       -  handle to structure containing the OST a base register
//                     addresses.
//   ticks          -  the unsigned 32-bit value containing the number of
//                     ticks to delay
//
static void XllpOstDelayTicks 
     (P_XLLP_OST_T pOstRegs, XLLP_UINT32_T ticks)
{    
    XLLP_UINT32_T    expireTime,
                    time;

    time = pOstRegs->oscr0;
	expireTime = time + ticks;

    //
    // Check if we wrapped on the expireTime
    // and delay first part until wrap
    //
	if (expireTime < time) 
    {
		while (time < pOstRegs->oscr0);
	}
	while (pOstRegs->oscr0 <= expireTime);
    return;
}

// 
// XllpOstDelayMilliSeconds
//
// Provides a delay using the OST OSCR0 clock.
//
// Inputs:
//   pOstRegs       -  handle to structure containing the OST a base register
//                     addresses.
//   milliseconds   -  the unsigned 32-bit value containing the number of
//                     milliseconds to delay
//
void XllpOstDelayMicroSeconds 
     (P_XLLP_OST_T pOstRegs, XLLP_UINT32_T microseconds)
{
    XLLP_UINT32_T    ticks;

    ticks = microseconds * XLLP_OST_TICKS_US;
    XllpOstDelayTicks (pOstRegs, ticks);
    return;
}




void set_CF_GPIO(void)
{

//UINT GPSR1 = 0x40e0001c;
//UINT  *pgpsr1 = (UINT *)GPSR1;

    UINT  MECR, *pMECR, MCMEM, *pMCMEM, MCATT, *pMCATT, MCIO, *pMCIO;
    XLLP_UINT32_T *pGPSR1 = (XLLP_UINT32_T *)0x40E0001C;
    XLLP_UINT32_T *pGPSR2 = (XLLP_UINT32_T *)0x40E00020;
    XLLP_UINT32_T *pGPCR2 = (XLLP_UINT32_T *)0x40E0002C;
    

    XLLP_UINT32_T GpioDirOutList[]={9,48,49,50,51,53, 54,55,81,85};
    XLLP_UINT32_T GpioDirInList[]={7,56,57,83,84,90,91,97};
    XLLP_UINT32_T GpioAltFnPinList[]={16,48,49,50,51,53,54,55,56,57,81,83,84,85,90,91,97};
    XLLP_UINT32_T GpioAltFnValList[]={16,2, 2, 2, 2, 0, 2, 2, 1, 1, 0, 0, 0, 1, 0, 0, 0};
    
    //XLLP_UINT32_T GpioDirOutList2[]={1,82};
   // XLLP_UINT32_T GpioAltFnPinList2[]={1,82};
   // XLLP_UINT32_T GpioAltFnValList2[]={1,0};
   
   	*pGPSR1 |= XLLP_BIT_19; //53
	//*pGPSR1 |= XLLP_BIT_16 | XLLP_BIT_17| XLLP_BIT_18 | XLLP_BIT_19|  // 48--51
		//		XLLP_BIT_22 | XLLP_BIT_23; // 54-55
	//*pGPSR2 |= XLLP_BIT_21; // 85
	//*pGPCR2 |= XLLP_BIT_15; // 79

   	XllpGpioSetDirectionIn((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioDirInList);
	XllpGpioSetDirectionOut((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioDirOutList);
 	XllpGpioSetOutput0((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioDirOutList);
	XllpGpioSetAlternateFn((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioAltFnPinList, GpioAltFnValList);
	
	// reset the card
	//*pGPSR2 |= XLLP_BIT_17; // GPIO81 for RESET should be clear later
   
/*
 
    XLLP_UINT32_T GpioDirInList1[]={1,97};
    XLLP_UINT32_T GpioAltFnPinList1[]={1,97};
    XLLP_UINT32_T GpioAltFnValList1[]={1,0};
    
   	XllpGpioSetDirectionIn((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioDirInList1);
	//XllpGpioSetDirectionOut((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioDirOutList1);
 	//XllpGpioSetOutput0((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioDirOutLis1t);
	XllpGpioSetAlternateFn((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioAltFnPinList1, GpioAltFnValList1);
*/
	// power 
   	//XllpGpioSetDirectionIn((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioDirInList);
	//XllpGpioSetDirectionOut((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioDirOutList2);
 	//XllpGpioSetOutput0((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioDirOutList2);
	//XllpGpioSetAlternateFn((P_XLLP_GPIO_T)GPIO_BASE_PHYSICAL, GpioAltFnPinList2, GpioAltFnValList2);



	MCMEM=0x48000028;   //Card I-face Common Mem Space socket 0 timing config
	pMCMEM = (UINT *)MCMEM; //Card I-face Common Mem Space socket 1 timing config
	if(DEBUG_IO)
		*pMCMEM = 0x0001C391;
	else
		*pMCMEM = 0x0000C497;
	//*pMCMEM = 0x0000ffff;

	MCATT=0x48000030; //Card I-face Attribute Space socket 0 timing config 
	pMCATT=(UINT *)MCATT;
	if(DEBUG_IO)
		*pMCATT = 0x0001C391;
	else
		*pMCATT=     0x0000C497;
	//*pMCATT=     0x0000ffff;

	// set the mcio
	MCIO   =  0x48000038;// Card I-face I/O Space socket 0 timing config       
	pMCIO =   (UINT *)MCIO; 
	if(DEBUG_IO)
		*pMCIO = 0x0001C391;
	else
		*pMCIO = 0x0000C497;
	//*pMCIO = 0x0000ffff;

	// set the socket number
	//MECR = 0x2;
	MECR = 0x48000014;
	pMECR = (UINT *)MECR;
	*pMECR = 0x2;
}

//#define pCardMem 0x28000200
// read the attr byte from the CF card

UCHAR PDCardReadAttrByte(UINT CardMem, int uOffset)
{
    UCHAR ret = 0;
    USHORT uByte;
    USHORT *pAttr = (USHORT *)CardMem;     // @parm Pointer to PC card attribute memory

   //RETAILMSG(1,(TEXT("Inside PCCardReadAttrByte()\r\n")));
   if(!LOGIC_EIGHT)
   	return cardReadRealByte(CardMem, uOffset);

	if(uOffset %2 != 0){
		pAttr += (uOffset-1)/2;
		uByte = *pAttr;
		ret   = uByte>>8;
	} else {
		pAttr += uOffset/2;
		uByte = *pAttr;
		ret   = uByte & 0xff;
	}
		
    
    
    return ret;
}

// write the byte in the attr space
void cardWriteAttrByte(UINT CardMem, int off,  UCHAR val) 
{
    	USHORT *pAta = (USHORT *)CardMem;     // @parm Pointer to PC card attribute memory
	USHORT tmp = 0, val_short = (USHORT)val;

	pAta = (USHORT *)CardMem;
	
	if(!LOGIC_EIGHT)
		cardWriteRealByte(CardMem, off, val);
	
	if(off%2!=0) {
		pAta += (off-1)/2;
		tmp = *pAta;
		val_short = val_short << 8;
		
		tmp = (tmp & 0xff) | val_short; 
		*pAta = tmp;
	}
	else {
		pAta += off/2;
		tmp = *pAta;
		tmp = (tmp & 0xff00) | val_short; 
		*pAta = tmp;
	}
}


// put the value to the card register by real 8-bit
void cardWriteRealByte(UINT BaseAddr, UCHAR off, UCHAR val)
{
	UCHAR  *pAta = 0;
	
	pAta = (UCHAR *)BaseAddr;
	
	pAta += off;
	*pAta = val;
//	if(DEBUG_IO)
//		XllpOstDelayTicks(g_pOstRegs, 1);
}

// get the value from the card register by real 8-bit
UCHAR cardReadRealByte(UINT BaseAddr, UCHAR off)
{
	UCHAR ret=0, *pAta = 0;
	
	pAta = (UCHAR *)AtaBase;
	pAta += off;
	ret = *pAta;
	
	return ret;
}

// test read and write the attr space
void test_rw() {
    UINT CardMem = 0x28000200;
    UINT IoAddr = 0x20000000;
    UINT CommAddr = 0x2C000000;
//    UINT *pCardMem, *pIoAddr, *pCommAddr;
    UINT read_result;

    //1.test the attr space
	 cardWriteAttrByte(CardMem, 0, 0x3);
	 
    read_result = PDCardReadAttrByte(CardMem, 0);
    read_result = PDCardReadAttrByte(CardMem, 2);
    read_result = PDCardReadAttrByte(CardMem, 4);
    read_result = PDCardReadAttrByte(CardMem, 6);

    cardWriteAttrByte(CardMem, 0, 0x0);
    cardWriteAttrByte(CardMem, 2, 0x80);
    
    //2. test the comm space
    read_result = PDCardReadAttrByte(CommAddr, 0);
    read_result = PDCardReadAttrByte(CommAddr, 1);
    read_result = PDCardReadAttrByte(CommAddr, 2);
    read_result = PDCardReadAttrByte(CommAddr, 3);    
    
    cardWriteAttrByte(CommAddr, 2, 0x1);
    cardWriteAttrByte(CommAddr, 3, 0x1);
    
    //3. test the IO space
    read_result = PDCardReadAttrByte(IoAddr, 0);
    read_result = PDCardReadAttrByte(IoAddr, 1);

    cardWriteAttrByte(IoAddr, 2, 0x1);
    cardWriteAttrByte(IoAddr, 3, 0x1);
    
    //printf("Finish the test!\n");
}

/**
 * Begin to test the ATA registers
 **/
void write_ata_reg_16(UINT AtaBase, UCHAR off, USHORT val)
{
	USHORT  *pAta = 0;
	
	pAta = (USHORT *)AtaBase;
	if(off%2!=0) {
		USHORT tmp = 0, change = val;
		// write the low byte of the val
		pAta += (off-1)/2;
		tmp = *pAta;
		change = val << 8;
		
		tmp = (tmp & 0xff) | change; 
		*pAta = tmp;
		// write the high byte of the val
		pAta += 1;
		tmp = *pAta;
		tmp = (tmp & 0xff00) | val; 
		*pAta = tmp;
	} else {
		pAta += off/2;
		*pAta = val;
	}
//	if(DEBUG_IO)
//		XllpOstDelayTicks(g_pOstRegs, 1);
}

USHORT read_ata_reg_16(UCHAR off)
{
	UINT AtaBase;
	USHORT ret=0;
	USHORT *pAta;
	if(DEBUG_IO)
		AtaBase = 0x20000000;
	else
		AtaBase = 0x2c000000;
	
	pAta = (USHORT *)AtaBase;
	
//	tmp =*pAta;
	if(off %2 != 0){
		USHORT tmp=0;
		UCHAR lowByte=0, highByte=0;
		//get low byte
		pAta += (off-1)/2;
		tmp = *pAta;
		lowByte   = tmp>>8;
		//get high byte
		pAta +=1;
		tmp = *pAta;
		highByte = tmp&0xff;
		
		ret = lowByte | (highByte<<8);
	} else {
		pAta += off/2;
		ret = *pAta;
	}
//	if(DEBUG_IO)
//		XllpOstDelayTicks(g_pOstRegs, 1);
		
	return ret;
}

// set a ATA commond 
void cfwr_comm_16(UINT AtaBase, UCHAR lba27, UCHAR lba23,UCHAR la15,UCHAR lba7, UCHAR cmd) //写参数命令函数
{
	USHORT param = 0, tmp = 0;

	//扇区数[0x02] = 1 + 扇区号[0x03]=lba7;
	param = 0x1;
	tmp = lba7;
	param = param | (tmp<<8);
	write_reg_16(AtaBase, 0x2, param);
	//低柱面号[0x04]=la15 + 高柱面号[0x05]=lba23
	tmp = lba23;
	param = la15 | (tmp<<8);
	write_reg_16(AtaBase, 0x4, param);
	//LBA方式 磁头 [0x06]=lba27 + 送写入命令30H[0x07]=cmd
	tmp = cmd;
	param = lba27 |(tmp<<8);
	write_reg_16(AtaBase, 0x6, param);
}

void cfwr_comm_byte(UINT AtaBase, UCHAR lba27, UCHAR lba23,UCHAR la15,UCHAR ba7, UINT cmd) //写参数命令函数
{
	//PBYTE[0x02]=0x1;//扇区数为1
	cardWriteAttrByte(AtaBase, 0x2, 0x1);
	//PBYTE[0x03]=lba7; //扇区号
	cardWriteAttrByte(AtaBase, 0x3, ba7);
	//PBYTE[0x04]=la15; //低柱面号
	cardWriteAttrByte(AtaBase, 0x4, la15);
	//PBYTE[0x05]=lba23;//高柱面号
	cardWriteAttrByte(AtaBase, 0x5, lba23);
	//PBYTE[0x06]=lba27; //设定LBA方式 磁头
	cardWriteAttrByte(AtaBase, 0x6, lba27);
	//PBYTE[0x07]=cmd; //送写入命令30H
	cardWriteAttrByte(AtaBase, 0x7, cmd);
}
 //写数据
void cf_write_dat_byte()
{
	UCHAR temp=0;
	UINT i, P1 = 0x1, AtaBase = 0;

	if(DEBUG_IO)
		AtaBase = 0x20000000;
	else
		AtaBase = 0x2c000000;

	for (i=0;i<512;i++) //连续写512字节
	
	{
		//P1=P1 & 0xf8; //选中外部RAM
		temp=0xBD;
		P1++; //根据实际电路选择中CF卡
		//PBYTE[0x00]=temp;
		if(DEBUG_IO)
			
		else
			
		if(DEBUG_IO){
			cardWriteAttrByte(AtaBase, 0x8, temp);
		}
		else{
			cardWriteAttrByte(AtaBase, 0, temp);
		}
//		if(i==254) {
//		     temp = 0;
//		}
	}
}

void cf_write_dat_16(UINT AtaBase)
{
	USHORT i,temp=0;
	UINT P1 = 0x1, AtaBase;
	
	for (i=0;i<256;i++) //连续写512字节
	{
		temp=0xe755;
		P1++; //根据实际电路选择中CF卡
		//set_ata_comm(0x0, temp);
		if(DEBUG_IO)
			write_reg_16(AtaBase, 8, temp);
		else
			write_reg_16(AtaBase, 0, temp);
	
	}
//	if(DEBUG_IO)
//		XllpOstDelayTicks(g_pOstRegs, 20);
}
 //读数据
void cf_read_dat_byte(UINT AtaBase)
{
	UINT temp=0;
	UINT  i, P1 = 0x1;

	//UCHAR dat[512]; //dat[]存放一个扇区的数据
	for (i=0;i<512;i++) //连续写512字节
	{
		//P1=P1 & 0xf8; //选中外部RAM
		P1++; //根据实际电路选择中CF卡

		temp = PDCardReadAttrByte(AtaBase, 0x8);
		dat[i]=temp;
	}
//	if(DEBUG_IO)
//		XllpOstDelayTicks(g_pOstRegs, 20);
}

void cf_read_dat_16(UINT AtaBase)
{
	USHORT i,temp=0;
	UINT P1 = 0x1;

	//USHORT dat_16[256]; //dat_16[]存放一个扇区的数据
	for (i=0;i<256;i++) //连续写512字节
	{
		//P1=P1 & 0xf8; //选中外部RAM
		P1++; //根据实际电路选择中CF卡
		//PBYTE[0x00]=temp;
		if(DEBUG_IO)
			temp = read_ata_reg_16(AtaBase, 0x8);
		else
			temp = read_ata_reg_16(AtaBase, 0x0);
		
		dat_16[i]=temp;
	}
//	if(DEBUG_IO)
//		XllpOstDelayTicks(g_pOstRegs, 20);
}

// resolve cf_write command
void cf_write(UINT AtaBase, UCHAR lba27, UCHAR lba23, UCHAR la15, UCHAR ba7, UCHAR cmd)
{
	UCHAR status = 0;

	//UINT flag_1 = 0, flag_2 = 0;
	// set the write command
	//if(NO_EIGHT)
		cfwr_comm_16(AtaBase, lba27, lba23, la15, ba7, cmd);
	//else
		//cfwr_comm_byte(AtaBase, lba27, lba23, la15, ba7, cmd);
	
	//写参数命令,指向逻辑6c扇区
	do
	{
		//status=PBYTE[0x07]; //读状态寄存器
		//status = get_ata_byte(7);
		status = PDCardReadAttrByte(AtaBase, 0x7);
		if((status & 0x01)==0x01){
			write_flag_err_1=1; //若ERR=1,置出错标志,做相应处理
			break;
		}
	
	}while(status!=0x58);

	if(NO_EIGHT)
		cf_write_dat_16(); //写入数据
	else
		cf_write_dat_byte();
	do
	{
		//status=PBYTE[0x07]; //读状态寄存器
		status = PDCardReadAttrByte(AtaBase, 0x7);
		if((status & 0x20)==0x20){
			write_flag_err_2=1; //若DWF=1时,置出错标志,做相应处理
			break;
		}
		if(DEBUG_IO)
			XllpOstDelayTicks(g_pOstRegs, 50);
	
	}while(status!=0x50);

}

// resolve cf_read command
void cf_read(UINT AtaBase, UCHAR lba27, UCHAR lba23,UCHAR la15, UCHAR lba7, UCHAR cmd)
{
	UCHAR status = 0;

	// set the read command
	//if(NO_EIGHT)
		cfwr_comm_16(AtaBase, lba27, lba23, la15, lba7, cmd);
	//else
		//cfwr_comm_byte(AtaBase, lba27, lba23, la15, lba7, cmd);
	//写参数命令,指向逻辑扇区
	do
	{
		//status=PBYTE[0x07]; //读状态寄存器
		status = PDCardReadAttrByte(AtaBase, 0x7);
		if((status & 0x01)==0x01){
			read_flag_err_1=1; //若ERR=1,置出错标志,做相应处理
			break;
		}
	
	}while(status!=0x58);
	
	//读出数据
	if(NO_EIGHT)
		cf_read_dat_16();
	else
		cf_read_dat_byte();
		 
	do
	{
		//status=PBYTE[0x07]; //读状态寄存器
		status = PDCardReadAttrByte(AtaBase, 0x7);
		if((status & 0x01)==0x01){
			read_flag_err_2=1; //若DWF=1时,置出错标志,做相应处理
			break;
		}
//		if(DEBUG_IO)
//			XllpOstDelayTicks(g_pOstRegs, 1);
	}while(status!=0x50);
}
// test the read and write operation to CF card
void test_read_write() 
{
	UINT AtaBase = 0;
		
	if(DEBUG_IO)
		AtaBase = 0x20000000;
	else
		AtaBase = 0x2c000000;

	// write data to the CF card
	UCHAR tou = 0x5;
	cf_write(AtaBase, 0xe0,0x00,0x00,tou,0x30);
	// read data from the CF card 
	cf_read(AtaBase, 0xe0,0x00,0x00,tou,0x20);
}
// set the CF card in IO mode
void set_IO_mode() {
    UINT CardMem = 0x28000200;
    cardWriteAttrByte(CardMem, 0, 0x1);
}
// the main function for the test
void k_start()
{
   
 // set the GPIO for CF card
   set_CF_GPIO();
   // test the attribute registers of the CF card
   test_rw();
   // test the ATA registers of the CF card
   if(DEBUG_IO)
   		set_IO_mode();
   test_read_write();
   
}

⌨️ 快捷键说明

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