⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oldsource.txt

📁 P1618QP bootloader code
💻 TXT
字号:
/****************************************************************************

    FUNCTION:	WritePIC

    PURPOSE: 

****************************************************************************/
DWORD APIENTRY WritePIC(HANDLE hComPort, PIC *pic, BYTE BtData[])
{
	BYTE *OutData;
	DWORD TotalBytes;
	DWORD CBootAddr;
	WORD BytesFromStart;
	WORD BytesFromEnd;
	WORD PacketCount;
	DWORD TotalBlocks;
	INT RecCount;

	//Block read commands
	switch (pic->BootCmd){
		case COMMAND_READVER:
		case COMMAND_READPM:
		case COMMAND_READEE:
		case COMMAND_READCFG:
			return ERROR_INVALID_COMMAND;
	}

	//return pic->MaxPktLen;
	if(pic->MinBytPBlk < 1) return ERROR_BLOCK_TOO_SMALL;

	//Limit the max packet size
	if((pic->MaxPktLen) > MAX_PACKET) return ERROR_MAX_PACKET_SIZE;

	//Get some memory
	OutData = malloc(pic->MaxPktLen);
	if(OutData == NULL) return ERROR_LOW_MEMORY;			//Abort if low mem

	//Get some block allignment info
	BytesFromStart = (WORD)(pic->BootAddr % pic->MinBytPBlk);
    TotalBytes = BytesFromStart + pic->BootDatLen;
    BytesFromEnd = (WORD)(pic->MinBytPBlk - (TotalBytes % pic->MinBytPBlk));
	if(BytesFromEnd == pic->MinBytPBlk) BytesFromEnd = 0;
    TotalBytes = TotalBytes + BytesFromEnd;

	TotalBlocks = TotalBytes / pic->MinBytPBlk;
	CBootAddr = pic->BootAddr - BytesFromStart;


	while (TotalBlocks > 0){

		//Build header
		OutData[0] = pic->BootCmd;
		OutData[2] = (BYTE)(CBootAddr & 0xFF);
		OutData[3] = (BYTE)((CBootAddr & 0xFF00) / 0x100);
		OutData[4] = (BYTE)((CBootAddr & 0xFF0000) / 0x10000);

		PacketCount = 5;


		//Pad the starting packet
		while (BytesFromStart > 0){
			OutData[PacketCount] = 255;
			PacketCount++;
			CBootAddr++;
			BytesFromStart--;
		}

		//Fill with data
		while (TotalBlocks > 0){
			OutData[PacketCount] = BtData[CBootAddr - pic->BootAddr];
			PacketCount++;
			CBootAddr++;

			if(!(CBootAddr % pic->MinBytPBlk)) {
				TotalBlocks--;
				if((pic->MaxPktLen - PacketCount) < pic->MinBytPBlk) break;
			}

			if((CBootAddr - pic->BootAddr) == pic->BootDatLen) break;
		}

		//Pad the end 
		while ((TotalBlocks == 1) && (BytesFromEnd > 0)){
			OutData[PacketCount] = 255;
			PacketCount++;
			CBootAddr++;
			BytesFromEnd--;

			if(!BytesFromEnd) TotalBlocks--;
		}


		OutData[1] = (PacketCount - 5) / pic->MinBytPBlk;

		RecCount = SendGetPacket(hComPort, OutData, PacketCount, pic->MaxPktLen, pic->NumOfRetrys);
		if(RecCount < 0) {
			free( OutData );
			return RecCount;
		}
	}

	free(OutData);

	return CBootAddr - pic->BootAddr; 
}



/****************************************************************************

    FUNCTION:	ReadPIC

    PURPOSE:	This function is for reading the microcontroller. The read
				request is serviced over one or multiple packets. 

****************************************************************************/
DWORD APIENTRY ReadPIC(HANDLE hComPort, PIC *pic, BYTE BtData[])
{
	BYTE *InData;
	BYTE PacketBlockCount;
	DWORD RecByteCount = 0;
	DWORD CBootDatLen;
	DWORD CBootAddr;
	WORD RecCount;
	WORD LoadCounter;

	//Check the command
	switch (pic->BootCmd){
		case COMMAND_WRITEPM:
		case COMMAND_ERASEPM:
		case COMMAND_WRITEEE:
		case COMMAND_WRITECFG:
			return ERROR_INVALID_COMMAND;
	}
	
	//return pic->MaxPktLen;
	if(pic->MinBytPBlk < 1) return ERROR_BLOCK_TOO_SMALL;

	//Limit the max packet size
	if((pic->MaxPktLen) > MAX_PACKET) return ERROR_MAX_PACKET_SIZE;

	//Get some memory
	InData = malloc(pic->MaxPktLen);
	if(InData == NULL) return ERROR_LOW_MEMORY;			//Abort if low mem


	CBootDatLen = pic->BootDatLen;
	CBootAddr = pic->BootAddr;

	while (CBootDatLen > 0){

		//Build packet header
		if(CBootDatLen > ((DWORD)(pic->MaxPktLen - 6)/(DWORD)pic->MinBytPBlk)){
			PacketBlockCount = (BYTE)((pic->MaxPktLen - 6) / (WORD)pic->MinBytPBlk);
		}
		else{
			PacketBlockCount = (BYTE)(CBootDatLen);
		}

		InData[0] = pic->BootCmd;
		InData[1] = PacketBlockCount;
		InData[2] = (BYTE)(CBootAddr & 0xFF);
		InData[3] = (BYTE)((CBootAddr & 0xFF00) / 0x100);
		InData[4] = (BYTE)((CBootAddr & 0xFF0000) / 0x10000);

		RecCount = SendGetPacket(hComPort, InData, 5, pic->MaxPktLen, pic->NumOfRetrys);
		if(RecCount < 0) {
			free( InData );
			return RecCount;
		}

		for(LoadCounter = 5; LoadCounter < RecCount - 1; LoadCounter++){
			BtData[RecByteCount] = InData[LoadCounter];
			RecByteCount++;
			CBootAddr++;
		}

		CBootDatLen = CBootDatLen - (DWORD)(RecCount - 6);
	}

	free( InData );

	return RecByteCount;  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -