📄 fmd.c.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 + -