📄 test_nandflash.c
字号:
/* * test_nandflash.c -- test nandflash id * * Author: lumit-admin <admin@lumit.org> * Date: 2004-8-26 * Copyright: http://www.lumit.org */#include "led.h"#include <stdio.h>//#define SYSCFG (0x03ff0000)#define UART0_BASE (SYSCFG + 0xD000)#define UART1_BASE (SYSCFG + 0xE000)/* * Serial settings....................... */ #define ULCON 0x00 #define UCON 0x04#define USTAT 0x08#define UTXBUF 0x0C#define URXBUF 0x10#define UBRDIV 0x14/* * Line control register bits............ */ #define ULCR8bits (3)#define ULCRS1StopBit (0)#define ULCRNoParity (0)/* * UART Control Register bits............ */ #define UCRRxM (1)#define UCRRxSI (1 << 2)#define UCRTxM (1 << 3)#define UCRLPB (1 << 7)/* * UART Status Register bits */ #define USROverrun (1 << 0)#define USRParity (1 << 1)#define USRFraming (1 << 2)#define USRBreak (1 << 3)#define USRDTR (1 << 4)#define USRRxData (1 << 5) #define USRTxHoldEmpty (1 << 6)#define USRTxEmpty (1 << 7)#define GET_STATUS(p) (*(volatile unsigned *)((p) + USTAT))#define RX_DATA(s) ((s) & USRRxData)#define GET_CHAR(p) (*(volatile unsigned *)((p) + URXBUF))#define TX_READY(s) ((s) & USRTxHoldEmpty)#define PUT_CHAR(p,c) (*(unsigned *)((p) + UTXBUF) = (unsigned )(c))void delay(){ int i, j; for( i=0; i<50; i++ ) for ( j=0; j<65536; j++ ) ;}void loop( void ){ LED_1_ON; LED_2_ON; LED_3_ON; LED_4_ON; delay(); LED_1_OFF; LED_2_OFF; LED_3_OFF; LED_4_OFF; delay(); LED_1_ON; LED_2_ON; LED_3_ON; LED_4_ON;}int putchar_uart0(int ch){ /* Place your implementation of fputc here */ /* e.g. write a character to a UART, or to the */ /* debugger console with SWI WriteC */ while ( TX_READY(GET_STATUS(UART0_BASE))==0); PUT_CHAR(UART0_BASE, ch); return ch;}struct __FILE { int handle; /* Add whatever you need here */};FILE __stdout;int fputc(int ch, FILE *f){ /* Place your implementation of fputc here */ /* e.g. write a character to a UART, or to the */ /* debugger console with SWI WriteC */ putchar_uart0( ch ); return ch;}int ferror(FILE *f){ /* Your implementation of ferror */ return EOF;}#define rPDATG (*(volatile unsigned *)0x03FF5008)//RB -> GPIO7//CLE -> GPIO15//ALE -> GPIO13//CE -> GPIO11#define RB (0x80)#define CLE (0x8000)#define ALE (0x2000) #define CE (0x800)//#define rKM29UXDATA (*(volatile unsigned char *)0x07000000) //E CS bank2 //16k = 0x4000//#define rKM29UXDATA (*(volatile unsigned char *)0x07fd0000) //E CS bank0//#define rKM29UXDATA (*(volatile unsigned char *)0x07fd4000) //E CS bank1//#define rKM29UXDATA (*(volatile unsigned char *)0x07fd8000) //E CS bank2#define rKM29UXDATA (*(volatile unsigned char *)0x07fd8000) //E CS bank2/*KM29U128操作宏定义*/#define FC_CMD {rPDATG |= CLE; rPDATG &= ~(ALE|CE);}#define FC_ADDR {rPDATG |= ALE; rPDATG &= ~(CLE|CE);}#define FC_DATA {rPDATG &= ~(ALE|CLE|CE);}#define FC_INACTIVE {rPDATG |= CE; rPDATG &= ~(ALE|CLE);} #define WAITRB while(!(rPDATG & RB)) //wait tWB and check R/B pin. unsigned int Check_Flash_Id(void){ int i; unsigned int id; FC_CMD; rKM29UXDATA = 0x90; FC_ADDR; rKM29UXDATA = 0; FC_DATA; for(i=0;i<10;i++); //wait 100ns id = rKM29UXDATA<<8; id += rKM29UXDATA; FC_INACTIVE; return id; }void Flash_Reset() //flash reset{ int i; FC_CMD; rKM29UXDATA = 0xff; //reset command for (i=0;i<3000;i++); //delay }void read_nand_flash_id( void ){ int id = 0; Flash_Reset(); printf( "*** lumit4510 test nand flash id program ***\r\n" ); id = Check_Flash_Id(); printf( "Nand Flash K9F2808Q0B chip id = 0x%x \r\n", id ); printf( "*** end ***\r\n" ); }//int main (void)void C_Entry( void ){ int count = 0; int REFEXTCON = *(unsigned int *)(SYSCFG + 0x303C); printf( "REFEXTCON = %x \r\n", REFEXTCON ); *(unsigned int *)0x03FF5000 = 0x0003ff7f; read_nand_flash_id(); while(1); while ( ++count ) { loop(); putchar_uart0( 'l' ); putchar_uart0( 'u' ); putchar_uart0( 'm' ); putchar_uart0( 'i' ); putchar_uart0( 't' ); }}/**************************************************************** * End of Pascal.c ****************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -