?? cf.c
字號:
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"
//#include "config.h"
//#include "board.h"
#define IDE_A0 (1<<1) //
#define IDE_A1 (1<<2) //
#define IDE_A2 (1<<3) //
//#define IDE_CS0 ( 0x28000020 ) //
//#define IDE_CS1 ( 0x28000030 ) //
#define IDE_CS0 ( 0x28000000 )
#define IDE_CS1 ( 0x28800000 )
//#define printf Uart_Printf
#define CFCard_Dected ( rGPGDAT&(1<<7) )
/*GPIO引腳影射寄存器地址*/
#define CF_REG_DATA IDE_CS0 /*數據寄存器*/
#define CF_REG_ERR (IDE_CS0 + IDE_A0) /*讀錯誤寄存器*/
#define CF_REG_FEATURE (IDE_CS0 + IDE_A0) /*寫功能寄存器*/
#define CF_REG_SECCNT (IDE_CS0 + IDE_A1) /*扇區計數器*/
#define CF_REG_SECTOR (IDE_CS0 + IDE_A1 + IDE_A0) /*扇區號*/
#define CF_REG_CYLINDER_LOW (IDE_CS0 + IDE_A2) /*柱面低8位*/
#define CF_REG_CYLINDER_HIGH (IDE_CS0 + IDE_A2 + IDE_A0) /*柱面高8位*/
#define CF_REG_DEVICE_HEAD (IDE_CS0 + IDE_A2 + IDE_A1) /*選擇主從,模式,磁頭*/
#define CF_REG_COMMAND (IDE_CS0 + IDE_A2 + IDE_A1 + IDE_A0)/*寫命令寄存器*/
#define CF_REG_STATUS (IDE_CS0 + IDE_A2 + IDE_A1 + IDE_A0)/*讀狀態寄存器*/
#define CF_REG_CONTROL (IDE_CS1 + IDE_A2 + IDE_A1) /*寫控制寄存器*/
#define CF_REG_ASTATUS (IDE_CS1 + IDE_A2 + IDE_A1) /*讀輔助狀態寄存器*/
/*設備磁頭寄存器*/
#define CF_DevReg_DEV0 0x00 /*設備為主盤*/
#define CF_DevReg_DEV1 0x10 /*設備為從盤*/
#define CF_DevReg_b5 0x20 /*保留位,為1*/
#define CF_DevReg_LBA 0x40 /*模式選擇位*/
#define CF_DevReg_b7 0x80 /*保留位,為1*/
volatile int CFCard_Flag;
U8 CF_Dev_Config ;
/***************************************************************************
Function name: CF_WriteSetting
Parameter : Sectors:寫入的起始扇區號 Count:扇區數
Description : CF讀設置命令序列
Return : void
Argument : 確定選擇的是主設備或是從設備和地址模式(使用LBA模式)
Autor & date :
****************************************************************************/
void CF_WriteSetting(U32 Sectors , U8 Count)
{
outportw(0,CF_REG_FEATURE); /*寫特征寄存器,與驅動接口*/
outportw(Count,CF_REG_SECCNT); /*寫扇區計數寄存器,與驅動接口*/
outportw(Sectors,CF_REG_SECTOR); /*寫扇區寄存器,與驅動接口*/
outportw(Sectors/0x100,CF_REG_CYLINDER_LOW); /*寫柱面低8位寄存器,與驅動接口*/
outportw(Sectors/0x10000,CF_REG_DEVICE_HEAD); /*寫設備磁頭寄存器,與驅動接口*/
outportw(((Sectors/0x1000000)&0x0f)|CF_Dev_Config,CF_REG_DEVICE_HEAD); /*寫設備磁頭寄存器,與驅動接口*/
outportw(0x30,CF_REG_COMMAND); /*寫命令寄存器,與驅動接口,0x30 寫扇區命令*/
}
/***************************************************************************
Function name: CF_ReadSetting
Parameter : Sectors:寫入的起始扇區號 Count:扇區數
Description : CF讀設置命令序列
Return : void
Argument : 確定選擇的是主設備或是從設備和地址模式(使用LBA模式)
Autor & date :
****************************************************************************/
void CF_ReadSetting(U32 Sectors , U8 Count)
{
outportw(0,CF_REG_FEATURE); /*寫特征寄存器,與驅動接口*/
outportw(Count,CF_REG_SECCNT); /*寫扇區計數寄存器,與驅動接口*/
outportw(Sectors,CF_REG_SECTOR); /*寫扇區寄存器,與驅動接口*/
outportw(Sectors/0x100,CF_REG_CYLINDER_LOW); /*寫柱面低8位寄存器,與驅動接口*/
outportw(Sectors/0x10000,CF_REG_DEVICE_HEAD); /*寫設備磁頭寄存器,與驅動接口*/
outportw(((Sectors/0x1000000)&0x0f)|CF_Dev_Config,CF_REG_DEVICE_HEAD); /*寫設備磁頭寄存器,與驅動接口*/
outportw(0x20,CF_REG_COMMAND); /*寫命令寄存器,與驅動接口,0x20 讀扇區命令*/
}
/***************************************************************************
Function name: CF_IsBusy
Parameter : void
Description : 忙檢測
Return : void
Argument :
Autor & date :
****************************************************************************/
U8 CF_IsBusy(void)
{
int time=0xffff; //沒有精確的值
U8 status=FALSE;
while(time--)
{
inportw(CF_REG_ASTATUS);
if(!(inportw(CF_REG_STATUS)&0x80)) //判斷CF卡是否忙
status=TRUE;
else
status=FALSE;
}
return status;
}
/***************************************************************************
Function name: CF_Init
Parameter : void
Description : CF卡初始化
Return : void
Argument :
Autor & date :
****************************************************************************/
void CF_Init(void)
{
rGPGCON = rGPGCON & (~(0x0f<<14)) ; //GPG7,GPG8 is input
//rGPECON = rGPECON & (~(0x03<<24)) ; //GPE12 is input
rGPBCON = rGPBCON & (~(0x03<<18)); //GPB9 input
rGPBCON = rGPBCON & (~(0x03<<20)) | (1<<20); //GPB10 output
//rGPFCON = rGPFCON & (~(0x03<<6)) ; //GPF3 is input
//rGPHCON = rGPHCON & (~(0x03<<20)) | (1<<20) ; //GPH10 is output
}
/***************************************************************************
Function name: CF_Probe
Parameter : void
Description : CF卡探測
Return : void
Argument :
Autor & date :
****************************************************************************/
void CF_Probe(void)
{
//rPDATB = ( rPDATB&(~(1<<5)) ) | ((0&1)<<5); //CF Power off
//rGPHDAT = ( rGPHDAT&(~(1<<10)) ) | ((0&1)<<10);
//rGPBDAT = ( (rGPBDAT&(~(1<<10)))|(1<<10));
//rGPBDAT = rGPBDAT|(1<<10);
rGPBDAT = ( rGPBDAT&(~(1<<10)) ) | ((0&1)<<10);
if(CFCard_Dected) //Probe CF CARD
CFCard_Flag=FALSE;
else
CFCard_Flag=TRUE;
if(CFCard_Flag)
{
//rPDATB = ( rPDATB&(~(1<<5)) ) | ((1&1)<<5);//Pwoer ON
//rGPHDAT = ( rGPHDAT&(~(1<<10)) ) | ((1&1)<<10);
rGPBDAT = ( rGPBDAT&(~(1<<10)) ) | ((1&1)<<10);
Uart_Printf("CF Card Detect OK\n");
}
else
Uart_Printf( "CF Card is NOT Pluged!!!\n" ) ;
}
/***************************************************************************
Function name: CF_Write_Sector
Parameter : void
Description : CF寫扇區函數
Return : void
Argument :
Autor & date :
****************************************************************************/
int CF_Write_Sector(U16 * Buffer, U32 Sector ,U8 count)
{
U8 Status=FALSE;
U16 i;
if(!CFCard_Flag) /*CF卡不可用,立即返回*/
return FALSE;
CF_WriteSetting( Sector, count); /*寫扇區設置*/
do
{ count--;
if(CF_IsBusy()) /*等待設備請求數據傳輸*/
{
for(i = 0; i < 256; i ++) /*連續寫256個字(512字節)數據,即寫入一個扇區*/
{
outportw(*(Buffer++),CF_REG_DATA); /*向數據寄存器寫一個字數據*/
}
Buffer +=256; /*調要寫入數據緩沖區的指針*/
}
else
break; /*出錯退出*/
}while(count>0);
if(CF_IsBusy()) /*等待設備就緒,讀取狀態寄存器同時檢測設備是否出錯*/
Status = TRUE; /*操作正確*/
return Status; /*返回*/
}
/***************************************************************************
Function name: CF_Read_Sector
Parameter : void
Description : CF讀扇區函數
Return : void
Argument :
Autor & date :
****************************************************************************/
int CF_Read_Sector(U16 * Buffer, U32 Sector ,U8 count)
{
U8 Status=FALSE;
U16 i;
U16 j;
if(!(CFCard_Flag)) /*CF卡不可用,立即返回*/
return FALSE; /*設備無效直接返回*/
CF_ReadSetting( Sector, count); /*讀扇區設置*/
do
{
count--; /*扇區數減1*/
if(CF_IsBusy()) /* 等待設備請求數據傳輸*/
{
for(i = 0; i < 256; i ++) /*連續讀256個字(512字節)數據,及一個扇區大小*/
{
//*Buffer=inportw(CF_REG_DATA);
//Buffer++;
j=inportw(CF_REG_DATA);
*(Buffer++)=j;
//*(Buffer++)=inportw(CF_REG_DATA); /*從數據寄存器讀一個字數據*/
}
Buffer +=256; /*調整數據格式*/
}
else break;
//else return 0; /*出錯,退出d0...while*/
}while(count>0); /*所有扇區數據傳輸完成*/
if(CF_IsBusy()) /*等待設備就緒,讀取狀態寄存器同時檢測設備是否出錯*/
Status = TRUE; /*操作正確*/
return Status; /*返回*/
}
/***************************************************************************
Function name: CF_SetDevice
Parameter : void
Description : 設置CF控制器
Return : void
Argument :
Autor & date :
****************************************************************************/
void CF_SetDevice(void)
{
CF_Dev_Config = CF_DevReg_DEV1 + /*選擇設備1*/
CF_DevReg_b5 +
CF_DevReg_LBA+ /*工作在LAB模式*/
CF_DevReg_b7;
outportw(CF_Dev_Config,CF_REG_DEVICE_HEAD);
}
/***************************************************************************
Function name: CF_Card_Test
Parameter : void
Description : CF讀寫測試
Return : void
Argument :
Autor & date :
****************************************************************************/
void CF_Card_Test( void )
{
U32 m,n ;
U16 data[512] ;
CF_Init(); //CF總線初始化
CF_Probe(); //CF驅動初始化
CF_SetDevice(); //設置CF設備
if(!(CFCard_Flag))return;
//給要寫入CF卡的數組賦值
for( m = 0 ; m < 32 ; m++ ) data[m] = m ;
Uart_Printf("write data : \n");
for( m = 0; m < 2; m++ )
{
for( n = 0; n < 16; n++ )
Uart_Printf( "%04x ", data[m*16+n] ) ;
Uart_Printf("\n");
}
Uart_Printf("\nCF Card Write Sector Test\n\n" );
CF_Write_Sector(data, 0, 2 ) ; //將data數組的數據寫入扇區0中
//在讀出CF卡之前,先將數組清零
for( m = 0 ; m < 32 ; m++ ) data[m] = 0 ;
Uart_Printf("\nCF Card Read Sector Test\n\n" );
CF_Read_Sector(data, 0, 2 ) ; //將寫入扇區0的數據讀出來
//打印讀出的數據
for( m = 0; m < 2; m++ )
{
for( n = 0; n < 16; n++ )
Uart_Printf( "%04x ", data[m*16+n] ) ;
Uart_Printf("\n");
}
for( m = 0 ; m < 32 ; m++ )
{
if( data[m] != m )
break ;
}
if( m == 32 ) Uart_Printf("\n讀出的數據與寫入的數據完全相符!\n");
else Uart_Printf("\n讀出的數據與寫入的數據在地址0x%04處不符! \n", m );
}
/********************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -