arm flash 烧写程序源码

  • C8_503752
    了解作者
  • 77.3KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-04-07 05:12
    上传日期
这是arm的flash烧写程序的源码,已经编译通过的
Arm Flash.rar
  • 目录.chm
    69.6KB
  • www.pudn.com.txt
    218B
  • jtag.h
    1.1KB
  • arm7tdmi.c
    9.1KB
  • hy29lv160.c
    16.2KB
  • arm7tdmi.h
    3.5KB
  • Makefile
    348B
  • hy29lv160.h
    1.4KB
  • jtag.c
    13.7KB
  • 下载说明.htm
    1.8KB
  • main.c
    9.7KB
内容介绍
//------------------------------------------------------------------------------ // 화일명 : hy29lv160.c // 프로젝트 : jflash-s3c44b0x // 설 명 : jflash-s3c44b0x 의 HY29LV160 Flash 처리 루틴이다. // // 원저자 : 유영창 (주)제이닷디앤티 frog@falinux.com // 작성일 : 2003년 5월 17일 // 수정 : 윤덕배 (주)배달정보통신 dadpeat@naver.com // 수정일 : 2003 년 9월 7일 // 원저작권 : (주)제이닷디앤티 // 이 프로그램 쏘스의 개작 및 재 배포를 허용 합니다. // 개작된 프로그램의 상업적 이용도 허용 합니다. // 개작된 프로그램의 공개는 필요하다면 하지 않아도 됩니다. // 재저작권 : GPL에 따름니다. // 주 의 : Flash 관련 함수의 address 는 16bit word 단위이다. // byte 단위로 생각하지 않도록 주의바람. //------------------------------------------------------------------------------ //****************************************************************************** // // 헤더 정의 // //****************************************************************************** #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <asm/io.h rel='nofollow' onclick='return false;'> #include <unistd.h> #include <string.h> #include <memory.h> #include "jtag.h" #include "arm7tdmi.h" #include "hy29lv160.h" int progress_pos = 0; unsigned int *HY29LV160_SA; unsigned int HY29LV160T_SA[] = { 0x00000, 0x08000, 0x10000, 0x18000, 0x20000, 0x28000, 0x30000, 0x38000, 0x40000, 0x48000, 0x50000, 0x58000, 0x60000, 0x68000, 0x70000, 0x78000, 0x80000, 0x88000, 0x90000, 0x98000, 0xA0000, 0xA8000, 0xB0000, 0xB8000, 0xC0000, 0xC8000, 0xD0000, 0xD8000, 0xE0000, 0xE8000, 0xF0000, 0xF8000, 0xFC000, 0xFD000, 0xFE000, 0x100000 }; unsigned int HY29LV160B_SA[] = { 0x00000, 0x02000, 0x03000, 0x04000, 0x08000, 0x10000, 0x18000, 0x20000, 0x28000, 0x30000, 0x38000, 0x40000, 0x48000, 0x50000, 0x58000, 0x60000, 0x68000, 0x70000, 0x78000, 0x80000, 0x88000, 0x90000, 0x98000, 0xA0000, 0xA8000, 0xB0000, 0xB8000, 0xC0000, 0xC8000, 0xD0000, 0xD8000, 0xE0000, 0xE8000, 0xF0000, 0xF8000, 0x100000 }; void Flash_Write_Halfword(unsigned int vaddress, unsigned int vdata) { JTAG_Write_Memory(vaddress<<1, vdata, HALFWORD); } unsigned int Flash_Read_Halfword(unsigned int vaddress) { unsigned int vdata; JTAG_Read_Memory(vaddress<<1, &vdata, HALFWORD); return(vdata); } unsigned int Flash_Read_Word(unsigned int vaddress) { unsigned int vdata; JTAG_Read_Memory(vaddress<<1, &vdata, WORD); return(vdata); } //------------------------------------------------------------------------------ // 설명 : 진행상태를 표시 한다. // 매계 : title : 상태 표시 // cur : 현재 진행도 // max : 최대값 // 반환 : // 주의 : 없음 //------------------------------------------------------------------------------ void HY29LV160_UpdateProgress(char *title, unsigned int cur, unsigned int max) { int dpywidth = 40; char bar[] = "===============================================================" "==============================================================="; char spaces[] = " " " "; char spinner[] = "\\|/-"; unsigned int i, percent; progress_pos = (progress_pos+1) & 3; percent = (cur * 100) / max; i = ((percent * dpywidth) + 50) / 100; printf("%s: |%s%s", title, bar + (sizeof(bar) - (i+1)), spaces + (sizeof(spaces) - (dpywidth - i + 1))); if(percent == 100) { printf("|"); } else { printf("%c", spinner[progress_pos & 3] ); } printf(" %4d%% \r", percent); if(percent == 100) /* clear prog bar */ { printf("%s\r", spaces + (sizeof(spaces) - 80)); } } //----------------------------------------------------------------------------- // 설 명 : RESET 시키는 명령 //------------------------------------------------------------------------------ void HY29LV160_Cmd_Reset(void) { Flash_Write_Halfword(0x0, 0xF0); } //------------------------------------------------------------------------------ // 설 명 : ID 를 읽는 명령 //----------------------------------------------------------------------------- void HY29LV160_Cmd_ReadID(void) { Flash_Write_Halfword(0x555, 0xAA); Flash_Write_Halfword(0x2AA, 0x55); Flash_Write_Halfword(0x555, 0x90); } //------------------------------------------------------------------------------ // 설 명 : 데이타를 써 넣는다. //----------------------------------------------------------------------------- void HY29LV160_Cmd_Write(unsigned int vaddress, unsigned int vdata) { Flash_Write_Halfword(0x555, 0xAA); Flash_Write_Halfword(0x2AA, 0x55); Flash_Write_Halfword(0x555, 0xA0); Flash_Write_Halfword(vaddress, vdata); } //------------------------------------------------------------------------------ //섹터를 지운다. //----------------------------------------------------------------------------- void HY29LV160_Cmd_Erase_Sector(unsigned int vaddress) { Flash_Write_Halfword(0x555, 0xAA); Flash_Write_Halfword(0x2AA, 0x55); Flash_Write_Halfword(0x555, 0x80); Flash_Write_Halfword(0x555, 0xAA); Flash_Write_Halfword(0x2AA, 0x55); Flash_Write_Halfword(vaddress, 0x30); } //------------------------------------------------------------------------ // 설 명 : 명령 수행 상태의 결과를 얻는다. // 매 계 : 없음 // 반 환 : 없음 // 주 의 : //------------------------------------------------------------------------ unsigned int HY29LV160_GetStatus(unsigned int vaddress) { unsigned int firststate, secondstate; while(1) { firststate = Flash_Read_Halfword(vaddress); // 첫번째 데이타를 읽는다. secondstate = firststate ^ Flash_Read_Halfword(vaddress); // 두번� 데이타를 읽는다. if(secondstate == 0) return HY29LV160_STATUS_READY; // 변화가 없다면 끝난것이다. else if(secondstate == 0x04) return HY29LV160_STATUS_ERSUSP; // 삭제중 중지되었다. else if(secondstate & 0x40) { if(firststate & 0x20) return HY29LV160_STATUS_TIMEOUT; // 시간이 초과 되었다. else return HY29LV160_STATUS_BUSY; // 바쁘다. } } return HY29LV160_STATUS_ERROR; // 에러가 났다. } //------------------------------------------------------------------------------ // 설 명 : Sector 에서 vsize 만큼 지운다. //----------------------------------------------------------------------------- unsigned int HY29LV160_EraseAreaSector(unsigned int vsize) { unsigned int loopcount, loop, addrpos, data, state; if(vsize == 0 || vsize > HY29LV160_SA[MAX_FLASH_SA]) { printf(" Erase size Error!!\n"); return vsize; } printf( " Erase Start...\n" ); HY29LV160_Cmd_Reset(); // RESET 시키는 명령 loopcount = 0; for(loop = 0; loop < MAX_FLASH_SA; loop++) { if(HY29LV160_SA[loop] <= (vsize - 1) && (vsize - 1) < HY29LV160_SA[loop + 1]) { loopcount = loop + 1; break; } } printf( " Erase Blocks -> [%d]\n", loopcount ); HY29LV160_UpdateProgress(" Erase ", 0, loopcount ); for( loop = 0; loop < loopcount; loop++ ) { addrpos = HY29LV160_SA[loop]; HY29LV160_UpdateProgress(" Erase ", loop, loopcount ); HY29LV160_Cmd_Erase_Sector(addrpos); while ((state = HY29LV160_GetStatus(addrpos)) == HY29LV160_STATUS_BUSY ) {} switch(state) { case HY29LV160_STATUS_READY: break; case HY29LV160_STATUS_BUSY: continue; case HY29LV160_STATUS_ERSUSP: HY29LV160_Cmd_Reset(); continue; case HY29LV160_STATUS_TIMEOUT: HY29LV160_Cmd_Reset(); continue; default: printf(" Erase Error!!!...\n" ); return -1; } } HY29LV160_UpdateProgress(" Erase ", loopcount, loopcount ); HY29LV160_Cmd_Reset(); // RESET 시키는 명령 return vsize; } //---------------------------------------------------------------------
评论
    相关推荐