亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? flash_uploader_appl.c

?? 使用JTAG口對(duì)AT91R40008芯片進(jìn)行FLASH編程的程序
?? C
字號(hào):
//*----------------------------------------------------------------------------
//*      ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : Flash_uploader_appl.c
//* Object              : Flash uploader application
//*
//* 1.0 9/04/02 NL    : Creation
//*----------------------------------------------------------------------------

#ifdef SEMIHOSTING
#include <stdio.h>
#endif

#include    "parts/r40008/lib_r40008.h"
#include    "targets/eb40a/eb40a.h"
#include    "parts/r40008/reg_r40008.h"

#include 	"global.h"
#include	"lib_flash_at29.h"
#include	"lib_flash_at49.h"

#include 	"eb_desc.h"
#include	"jtag.h"
#include	"Flash_uploader.h"
#include	"Flash_uploader_appl.h"


//*----------------------------------------------------------------------------
//* Global variables
Target	*eval_board = NULL;

extern  u_int	Current_Scan_Chain;
extern  u_int	context[16];
extern	Target  Target_Table[];

//*----------------------------------------------------------------------------
//* Function Name       : Recognize_Target
//* Object              : Identify the target according to the ID
//* Input Parameters    : id
//* Output Parameters   : TRUE or FALSE
//*----------------------------------------------------------------------------
int Recognize_Target(u_int id){
	
	u_short target = 0;

	while ( ((id & SF_CIDR_MASK) != Target_Table[target].id_chip ) &&
			(target < NB_TARGET_SUPPORTED) ){
			
			target++;
	}
	
	if (target < NB_TARGET_SUPPORTED){
		eval_board = & Target_Table[target];	
		return (TRUE);
	}

	return (FALSE);
}

//*----------------------------------------------------------------------------
//* Function Name       : Initialize_Periph
//* Object              : Initialize target's EBI or PLL 
//* Input Parameters    : periph (EBI or PLL)
//* Output Parameters   : none
//*----------------------------------------------------------------------------
void Initialize_Periph(u_int periph){

	Instr		*ptr_instr = eval_board->ebi.instruction;
	u_short 	nb_instr = eval_board->ebi.nb_instr;
	u_short 	wait_state = NO_WAIT_STATE;
	u_int 		value, mask;
	
	if (periph){ //* periph == PLL
		wait_state = WAIT_STATE;
		ptr_instr = eval_board->pll.instruction;
		nb_instr = eval_board->pll.nb_instr;
	}
	
	while (nb_instr > 0){
			
			switch (ptr_instr->type_instr){
				
				case WRITE :
					JTAG_Write_Memory(ptr_instr->address,
									  ptr_instr->data,
									  WORD, wait_state);
					break;
					
				case POLL :
					
					mask = ptr_instr->data;
				
					JTAG_Read_Memory(ptr_instr->address, &value, WORD, wait_state);
				
					while ((value & mask) != mask){
						JTAG_Read_Memory(ptr_instr->address, &value, WORD, wait_state);
					}
					
					break;
	
				default : break;
			}
			
			ptr_instr++;
			nb_instr--;		
	}

}

//*----------------------------------------------------------------------------
//* Function Name       : Pause
//* Object              : Wait 20 ms
//* Input Parameters    : none
//* Output Parameters   : none
//*----------------------------------------------------------------------------
void Pause(){
	
	int count;
	
    for (count=0; count < WAIT; count++)
    {
        /* Do nothing - just wait */
    }

}

//*----------------------------------------------------------------------------
//* Function Name       : Identify_Flash_LV
//* Object              : Identify the LV Flash
//* Input Parameters    : none
//* Output Parameters   : flash device_code 
//*----------------------------------------------------------------------------
u_int Identify_Flash(u_int *code){

	u_int	i;
	u_int   manuf_code;
	u_int	base_addr = FLASH_BASE_ADDR;

	//* Load the program to identify the flash
	Load_Program( (u_int *)&(eval_board->flash_ident) );

	//* Set a context
	for (i=0; i<15; i++){
		context[i] = 0;
	}

	//* Launch the program
	JTAG_Go(START_PRG);
	
	//* Send the flash base_addr
	if (Com_Channel_Write_Data(base_addr) != TRUE){
		return 	FALSE;
	}
	
	//* Read Manufacturer and device code from the device
	if (Com_Channel_Read_Data(&manuf_code) != TRUE){
		return FALSE;
	}
	manuf_code &= FLASH_CODE_MASK;
	
	if (Com_Channel_Read_Data(code) != TRUE){
		return FALSE;
	}
	*code &= FLASH_CODE_MASK;

    /* Check the Manufacturer - Fail if not known */
    if (manuf_code != ATMEL_MANUFACTURED) {
        at91_print(&COM0,"Flash not recognized!!!\n\r");
        return FALSE;
    } else {
    	at91_print(&COM0,"Flash recognized\n\r");
    }
	
	return TRUE;
}

//*----------------------------------------------------------------------------
//* Function Name       : Load_Flash_Program
//* Object              : Load the flash program in the target
//* Input Parameters    : none
//* Output Parameters   : none
//*----------------------------------------------------------------------------
void Load_Program(u_int *program){
	
	Program	 *prog = (Program *)program;
	u_int i, mask = 0;
	u_int size, load_addr, *prg;
	
	Current_Scan_Chain = -1;
	size = prog->size;
	load_addr = prog->load_addr;
	prg = prog->prg;
	
	//* Set the mask for the Store_Multiple function
	for (i=NB_REG; i>0; i--){
		mask |= (1<<(NB_REG-i));
	}
	
	while (size>((NB_REG-1)*SIZE_DATA)){
	
		//* Copy the program
		JTAG_Load_Multiple(NB_REG, prg);	
		JTAG_Store_Multiple(load_addr, mask);

		JTAG_Read_Register(R0, NULL); //* Avoid scratch of next reading	
	
		prg += NB_REG;
		load_addr += (NB_REG*SIZE_DATA);
		size -= NB_REG*SIZE_DATA;
	}
	
	//* Copy the end of the program
	if (size > 0){
		
		mask = 0;
		
		//* Set the mask
		for (i=(size>>2); i>0; i--){
			mask |= (1<<((size>>2)-i));
		}
	
		//* Copy the program
		JTAG_Load_Multiple((size>>2), prg);
		JTAG_Store_Multiple(load_addr, mask);
		
		JTAG_Read_Register(R0, NULL); //* Avoid scratch of next reading	
	}
	
	return;
}

//*----------------------------------------------------------------------------
//* Function Name       : Flash_LV_Send_Data
//* Object              : Send Data for Flash LV
//* Input Parameters    : addr, *data, size in bytes
//* Output Parameters   : none
//*----------------------------------------------------------------------------
u_int Flash_LV_Send_Data(u_int *program, u_short erase){

	Program	*prog = (Program *)program;
	u_int  	i, size, load_addr, *prg;
	u_int  	end = 0;
	u_int 	value;

	size = prog->size;
	load_addr = prog->load_addr;
	prg = prog->prg;	

	while (size > SIZE_256_BYTES){
		
		if (Com_Channel_Write_Data(load_addr) != TRUE){
			return FALSE;
		}
		
		i=0;
			
		//* Store 64 32 bits words from the Comm Channel to a buffer 
		while (i < PACKET_SIZE){
		
			if (erase){
			
				if (Com_Channel_Write_Data(ERASE_DATA) != TRUE){
					return FALSE;
				}
		
			} else {
		
				if (Com_Channel_Write_Data( *(prg++) ) != TRUE){
					return FALSE;
				}
			}
		
			i++;
		}

		if (Com_Channel_Write_Data(end) != TRUE){
			return FALSE;
		}

		load_addr += SIZE_256_BYTES;
		size -= SIZE_256_BYTES;
	}
	
	//* Flag for the last packet to send
	end = 1;
	
	if (size > 0){
	
		if (Com_Channel_Write_Data(load_addr) != TRUE){
			return FALSE;
		}
		
		i=0;
			
		//* Store 64 32 bits words from the Comm Channel to a buffer 
		while (i < PACKET_SIZE){
		
			if (size > 0){
				
				if (erase){
					if (Com_Channel_Write_Data(ERASE_DATA) != TRUE){
						return FALSE;
					}
				} else {
					if (Com_Channel_Write_Data( *(prg++) ) != TRUE){
						return FALSE;
					}
				}
				size -= SIZE_DATA;
			
			} else {
				//* 128 bytes MUST be sent
				if (Com_Channel_Write_Data(ERASE_DATA) != TRUE){
					return FALSE;
				} 
			}
			
			i++;
		}

		if (Com_Channel_Write_Data(end) != TRUE){
			return FALSE;
		}

		//* Wait target has finished
		if (Com_Channel_Read_Data(&value) != TRUE){
			return FALSE;
		}
	
		if (value != 0xCAFECAFE){
			return FALSE;
		}

	}
	
	return TRUE;
}


//*----------------------------------------------------------------------------
//* Function Name       : Flash_BV_Send_Data
//* Object              : Send Data for Flash BV
//* Input Parameters    : ptr towards data, flash device_code
//* Output Parameters   : none
//*----------------------------------------------------------------------------
u_int Flash_BV_Send_Data(u_int *program, u_int code, u_short erase){
	
	Program	*prog = (Program *)program;
	u_int  size, load_addr, *prg;
	u_int  count, value;

	//* Init local variables
	size = prog->size;
	load_addr = prog->load_addr;
	prg = prog->prg;	
	
	Current_Scan_Chain = -1;
	
	//* Send the load address on the target
	if (Com_Channel_Write_Data(load_addr) != TRUE){
		return FALSE;
	}
	
	//* Send the flash device code 
	if (Com_Channel_Write_Data(code) != TRUE){
		return FALSE;
	}
	
	//* Send program size in bytes
	if (Com_Channel_Write_Data(size) != TRUE){
		return FALSE;
	}
	
	//* Send data
	for (count = 0; count<size; count += SIZE_DATA){
		
		if (erase){
			
			if (Com_Channel_Write_Data(ERASE_DATA) != TRUE){
				return FALSE;
			}
		
		} else {
		
			if (Com_Channel_Write_Data( *(prg++) ) != TRUE){
				return FALSE;
			}
		}
	
	}
	
	//* Wait target has finished
	if (Com_Channel_Read_Data(&value) != TRUE){
		return FALSE;
	}
	
	if (value != 0xCAFECAFE){
		return FALSE;
	}
	
	return TRUE;
}


//*----------------------------------------------------------------------------
//* Function Name       : JTAG_Flash_uploader
//* Object              : Flash uploader application
//* Input Parameters    : none
//* Output Parameters   : none
//*----------------------------------------------------------------------------
void JTAG_Flash_uploader(u_short erase, u_short mirror){

	u_int	value, i, nb_prg = 0;
	u_int 	*ptr_prg;
	u_int 	device_code;
	u_int 	watchdog = 0;
	u_int 	flash_recognized = FALSE;
	
	//* The JTAG must be resetted and the core must be stopped !!!

	//* Read ID of the target and identify 
	//* Be careful, the target may be clocked at 32 kHz so wait_states added to prevent bug
	JTAG_Read_Memory(SF_CHIP_ID, &value, WORD, WAIT_STATE);
	
	if ( Recognize_Target(value) != TRUE ){
		at91_print(&COM0,"Target not recognized!!!\n\r");
		return;
	} else {
		sprintf(message,"The target ID chip is : 0x%08X\n\r", eval_board->id_chip);
   		at91_print(&COM0,message);
   		
   		if ((mirror) && (eval_board->id_chip != EB40A)){
   			at91_print(&COM0,"Mode Mirror is not possible with this target!!!\n\r");
   			return;
   		}
   		
	}

	//* Initialize PLL if necessary
	Initialize_Periph(PLL);	
	
	//* Initialize EBI
	Initialize_Periph(EBI);
	
	while ((flash_recognized != TRUE) && (watchdog++ < NB_TRY)){ //* Get the index in the flash table
	
		//* Verify that you are still in Supervisor Mode before launching the program
		JTAG_Read_CPSR(&value);
		
		if ( (value & 0x1F) != SUPERVISOR_MODE){	
			//* Pass in supervisor mode
			//* IRQ and FIQ disabled, ARM mode
			JTAG_Write_CPSR(SUPERVISOR_MODE, (IRQ_BIT)0x1, (FIQ_BIT)0x1, (THUMB_BIT)0x0);
		}
	
		//* Set supervisor mode 
		//* IRQ and FIQ disabled, ARM mode
		//* JTAG_Write_CPSR(SUPERVISOR_MODE, (IRQ_BIT)0x1, (FIQ_BIT)0x1, (THUMB_BIT)0x0);	
		
		//* Flash Identify
		if (Identify_Flash(&device_code) == TRUE){
			flash_recognized = TRUE;
		} else {
			JTAG_Stop();
		}
	
	}
	 
	if (flash_recognized == TRUE){
		watchdog = 0;
	}

	while ( (nb_prg < NB_PRG) && (watchdog < NB_TRY) ){
	
		sprintf(message,"LOOP : %d\n\r", nb_prg);
   		at91_print(&COM0,message);
	
		//* STOP the target
		JTAG_Stop();
		
		//* Verify that you are still in Supervisor Mode before launching the program
		JTAG_Read_CPSR(&value);
		
		JTAG_Analyse_CPSR(value);	//* Debug
		
		if ( (value & 0x1F) != SUPERVISOR_MODE){
		
			//* Pass in supervisor mode
			//* IRQ and FIQ disabled, ARM mode
			JTAG_Write_CPSR(SUPERVISOR_MODE, (IRQ_BIT)0x1, (FIQ_BIT)0x1, (THUMB_BIT)0x0);
		}
	
		//* Load Flash program in the target
		Load_Program( (u_int *)&(eval_board->flash_prg) );
		
		//* Set the following context in supervisor mode
		for (i=0; i<15; i++){
			context[i] = 0;
		}
		
		//* Launch the program
		JTAG_Go(START_PRG);

		if (mirror) {
			ptr_prg = (u_int *)&(eval_board->mirror);
		} else {
			//* Select data to load
			switch (nb_prg){
		
				case 0 : //* boot
					ptr_prg = (u_int *)&(eval_board->boot);
					break;
				case 1 : //* angel
					ptr_prg = (u_int *)&(eval_board->angel);
					break;
				case 2 : //* appli
					ptr_prg = (u_int *)&(eval_board->appli);
					break;
				default : break;
			}
		} //* End if mirror
	
		//* Send data according to the flash type
		if (eval_board->flash){
			//* Flash BV
			if (Flash_BV_Send_Data(ptr_prg, device_code, erase) == TRUE){
				if (mirror){
					nb_prg = NB_PRG;
				} else {
					nb_prg++;
				}
				
				sprintf(message,"watchdog : %d\n\r", watchdog);
   				at91_print(&COM0,message);
   				
				watchdog = 0;
			
			} else {
				watchdog++;
			}
			
		} else {
			//* Flash LV
			if (Flash_LV_Send_Data(ptr_prg, erase) == TRUE){
				if (mirror){
					nb_prg = NB_PRG;
				} else {
					nb_prg++;
				}
				
				sprintf(message,"watchdog : %d\n\r", watchdog);
   				at91_print(&COM0,message);
   				
				watchdog = 0;
			
			} else {
				watchdog++;
			}	
		} //* End if Flash Type
	
	} //* End while

	if (watchdog > NB_TRY){
		at91_print(&COM0,"\n\rPROBLEM!!!\n\r");
		return;
	}
		
	if (erase){
		at91_print(&COM0,"\n\rThe target is erased!!!\n\r");	
	} else {
		at91_print(&COM0,"\n\rThe target is ready!!!\n\r");	
	}
	
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线播放中文一区| 国产成人精品影视| 欧美一区二区三区在线视频| 偷拍亚洲欧洲综合| 91精品国产综合久久精品图片| 人人精品人人爱| 欧美mv日韩mv亚洲| 国产成人av一区二区三区在线 | 日韩视频国产视频| 激情文学综合网| 国产欧美精品一区二区三区四区| 成人av网站在线观看免费| 国产精品久久久一区麻豆最新章节| 成人av在线资源| 亚洲国产乱码最新视频| 欧美一区二区网站| 国产在线播放一区三区四| 国产精品视频线看| 欧美性猛交xxxx乱大交退制版 | 91在线丨porny丨国产| 亚洲精品精品亚洲| 欧美一区二区三区成人| 极品美女销魂一区二区三区| 国产欧美日产一区| 欧美亚洲动漫另类| 狠狠久久亚洲欧美| 综合亚洲深深色噜噜狠狠网站| 欧美三级资源在线| 国产一区二区免费看| 亚洲精品国久久99热| 欧美成人午夜电影| 成人av电影在线网| 日韩高清电影一区| 国产精品欧美久久久久无广告 | 国产成a人亚洲精| 亚洲综合激情网| 久久久久青草大香线综合精品| 91视频在线观看| 久久国内精品视频| 亚洲一区二区三区激情| 国产午夜一区二区三区| 欧美日韩夫妻久久| 成人禁用看黄a在线| 日韩不卡一二三区| 亚洲男女毛片无遮挡| 精品日韩成人av| 欧美日韩国产综合一区二区三区| 国产精品66部| 丝袜美腿亚洲一区| 亚洲欧美日韩一区二区三区在线观看| 欧美成人官网二区| 欧美亚洲高清一区二区三区不卡| 国产精品系列在线观看| 日本sm残虐另类| 亚洲福利国产精品| 亚洲欧美另类综合偷拍| 国产午夜精品一区二区| 欧美成人精品福利| 欧美日韩国产成人在线免费| 91亚洲永久精品| 成人毛片视频在线观看| 国内精品伊人久久久久av一坑| 天堂一区二区在线免费观看| 亚洲乱码国产乱码精品精98午夜| 欧美国产精品一区| 欧美精品一区二区高清在线观看| 欧美日本视频在线| 欧美日韩在线直播| 欧美影院午夜播放| 在线观看国产日韩| 色一区在线观看| 色偷偷久久一区二区三区| 成人av片在线观看| 成人高清视频在线| 国产成人精品午夜视频免费| 国产又粗又猛又爽又黄91精品| 麻豆91免费看| 久久97超碰国产精品超碰| 日韩va亚洲va欧美va久久| 午夜激情综合网| 手机精品视频在线观看| 日日摸夜夜添夜夜添亚洲女人| 性欧美大战久久久久久久久| 亚洲成人自拍网| 日本欧美一区二区三区| 日韩av中文在线观看| 免费在线观看一区| 激情欧美一区二区| 国产成人免费在线| 成人爱爱电影网址| 91成人在线观看喷潮| 欧美午夜精品理论片a级按摩| 欧美亚洲另类激情小说| 91精品黄色片免费大全| 日韩一区二区麻豆国产| 337p粉嫩大胆噜噜噜噜噜91av| 国产日韩欧美一区二区三区乱码 | 久久久精品蜜桃| 亚洲国产成人在线| 亚洲欧美一区二区三区久本道91| 亚洲另类在线视频| 亚洲国产精品久久艾草纯爱| 欧美a级一区二区| 国产成人综合在线播放| 99精品久久99久久久久| 欧美日韩中文字幕一区| 精品久久久久香蕉网| 中文字幕av一区二区三区高| 亚洲精品欧美综合四区| 免费欧美在线视频| 精品一区二区国语对白| 粉嫩av一区二区三区在线播放| 91在线porny国产在线看| 欧美男男青年gay1069videost| 欧美成人aa大片| 91久久精品一区二区三| 在线视频中文字幕一区二区| 欧美性猛交一区二区三区精品| 日韩一级免费观看| 日本一区二区免费在线| 一区二区三区中文字幕电影| 免费人成在线不卡| 91麻豆国产福利在线观看| 欧美一区二区女人| 国产精品久久毛片av大全日韩| 日产国产高清一区二区三区| 成人小视频在线观看| 7777精品伊人久久久大香线蕉超级流畅| 久久亚洲捆绑美女| 亚洲超碰精品一区二区| 国产精品123| 欧美一区日本一区韩国一区| 亚洲天堂免费在线观看视频| 伦理电影国产精品| 欧美午夜精品久久久久久超碰| 亚洲国产中文字幕| 国产伦精品一区二区三区免费迷| 色婷婷精品久久二区二区蜜臀av| wwwwww.欧美系列| 亚洲无人区一区| 99久久99久久精品国产片果冻| 日韩免费在线观看| 亚洲国产欧美在线| 97se亚洲国产综合在线| 亚洲精品在线电影| 午夜不卡在线视频| 91蜜桃传媒精品久久久一区二区| 精品99999| 久久精品国产免费| 欧美理论片在线| 一区二区三区成人在线视频| 高清免费成人av| 久久婷婷国产综合精品青草 | 一区二区三区.www| 波多野结衣中文字幕一区| 精品成人一区二区三区四区| 天堂在线一区二区| 在线观看国产日韩| 一区二区三区四区不卡在线| 福利一区二区在线| 久久久久久久久岛国免费| 久久精品久久综合| 日韩一区二区在线观看视频| 日韩精品亚洲专区| 欧美丰满嫩嫩电影| 午夜电影网亚洲视频| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 9色porny自拍视频一区二区| 久久精品视频免费| 国内一区二区视频| 久久夜色精品国产欧美乱极品| 精品综合久久久久久8888| 日韩欧美卡一卡二| 七七婷婷婷婷精品国产| 日韩精品在线一区二区| 蜜臀久久99精品久久久画质超高清| 欧美精选在线播放| 日本aⅴ精品一区二区三区| 91精品国产欧美一区二区成人| 日韩电影在线观看一区| 欧美一区二区三区小说| 久久国内精品视频| 国产欧美va欧美不卡在线| 成人午夜免费av| 亚洲人成电影网站色mp4| 91热门视频在线观看| 亚洲一本大道在线| 欧美一级夜夜爽| 国产盗摄视频一区二区三区| 国产精品色呦呦| 91黄色激情网站| 日韩电影在线一区二区三区| www国产成人免费观看视频 深夜成人网| 国产精品一区二区三区四区 | 国产精品传媒入口麻豆| 色婷婷久久久久swag精品| 天天操天天干天天综合网| 91精品国产乱码| 大尺度一区二区| 亚洲国产一区二区三区|