mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 05:12:33 +01:00 
			
		
		
		
	Make TPI programming protocol program in words, not bytes to satisfy the datasheet conditions.
This commit is contained in:
		
							parent
							
								
									4d246a82cb
								
							
						
					
					
						commit
						b736a5ef2b
					
				| @ -156,7 +156,7 @@ | |||||||
|  * |  * | ||||||
|  *  <b><sup>1</sup></b> <i>Optional, see \ref SSec_Options section - for USB AVRs with ADC modules only</i> \n |  *  <b><sup>1</sup></b> <i>Optional, see \ref SSec_Options section - for USB AVRs with ADC modules only</i> \n | ||||||
|  *  <b><sup>2</sup></b> <i>When XPROG_VIA_HARDWARE_USART is set, the AVR's Tx and Rx become the DATA line when connected together |  *  <b><sup>2</sup></b> <i>When XPROG_VIA_HARDWARE_USART is set, the AVR's Tx and Rx become the DATA line when connected together | ||||||
|  *                         via a pair of 300 ohm resistors, and the AVR's XCK pin becomes CLOCK.</i> \n |  *                         via a pair of 220 ohm resistors, and the AVR's XCK pin becomes CLOCK.</i> \n | ||||||
|  *  <b><sup>3</sup></b> <i>See AUX line related tokens in the \ref SSec_Options section</i> |  *  <b><sup>3</sup></b> <i>See AUX line related tokens in the \ref SSec_Options section</i> | ||||||
|  * |  * | ||||||
|  *  \section Sec_TPI TPI Connections |  *  \section Sec_TPI TPI Connections | ||||||
| @ -202,7 +202,7 @@ | |||||||
|  * |  * | ||||||
|  *  <b><sup>1</sup></b> <i>Optional, see \ref SSec_Options section - for USB AVRs with ADC modules only</i> \n |  *  <b><sup>1</sup></b> <i>Optional, see \ref SSec_Options section - for USB AVRs with ADC modules only</i> \n | ||||||
|  *  <b><sup>2</sup></b> <i>When XPROG_VIA_HARDWARE_USART is set, the AVR's Tx and Rx become the DATA line when connected together |  *  <b><sup>2</sup></b> <i>When XPROG_VIA_HARDWARE_USART is set, the AVR's Tx and Rx become the DATA line when connected together | ||||||
|  *                         via a pair of 300 ohm resistors, and the AVR's XCK pin becomes CLOCK.</i> \n |  *                         via a pair of 220 ohm resistors, and the AVR's XCK pin becomes CLOCK.</i> \n | ||||||
|  *  <b><sup>3</sup></b> <i>See AUX line related tokens in the \ref SSec_Options section</i> |  *  <b><sup>3</sup></b> <i>See AUX line related tokens in the \ref SSec_Options section</i> | ||||||
|  * |  * | ||||||
|  *  \section SSec_Options Project Options |  *  \section SSec_Options Project Options | ||||||
|  | |||||||
| @ -141,11 +141,11 @@ bool TINYNVM_ReadMemory(const uint16_t ReadAddress, uint8_t* ReadBuffer, uint16_ | |||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** Writes byte addressed memory to the target's memory spaces.
 | /** Writes word addressed memory to the target's memory spaces.
 | ||||||
|  * |  * | ||||||
|  *  \param[in]  WriteAddress  Start address to write to within the target's address space |  *  \param[in]  WriteAddress  Start address to write to within the target's address space | ||||||
|  *  \param[in]  WriteBuffer   Buffer to source data from |  *  \param[in]  WriteBuffer   Buffer to source data from | ||||||
|  *  \param[in]  WriteLength   Total number of bytes to write to the device |  *  \param[in]  WriteLength   Total number of bytes to write to the device (must be an integer multiple of 2) | ||||||
|  * |  * | ||||||
|  *  \return Boolean true if the command sequence complete successfully |  *  \return Boolean true if the command sequence complete successfully | ||||||
|  */ |  */ | ||||||
| @ -154,6 +154,10 @@ bool TINYNVM_WriteMemory(const uint16_t WriteAddress, const uint8_t* WriteBuffer | |||||||
| 	/* Wait until the NVM controller is no longer busy */ | 	/* Wait until the NVM controller is no longer busy */ | ||||||
| 	if (!(TINYNVM_WaitWhileNVMControllerBusy())) | 	if (!(TINYNVM_WaitWhileNVMControllerBusy())) | ||||||
| 	  return false; | 	  return false; | ||||||
|  | 	   | ||||||
|  | 	/* Must have an integer number of words to write - if extra bytes, abort programming */ | ||||||
|  | 	if (WriteLength & 0x01) | ||||||
|  | 	  return false; | ||||||
| 
 | 
 | ||||||
| 	/* Set the NVM control register to the WORD WRITE command for memory reading */ | 	/* Set the NVM control register to the WORD WRITE command for memory reading */ | ||||||
| 	TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr); | 	TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr); | ||||||
| @ -162,11 +166,22 @@ bool TINYNVM_WriteMemory(const uint16_t WriteAddress, const uint8_t* WriteBuffer | |||||||
| 	/* Send the address of the location to write to */ | 	/* Send the address of the location to write to */ | ||||||
| 	TINYNVM_SendPointerAddress(WriteAddress); | 	TINYNVM_SendPointerAddress(WriteAddress); | ||||||
| 	 | 	 | ||||||
| 	while (WriteLength--) | 	while (WriteLength) | ||||||
| 	{ | 	{ | ||||||
| 		/* Write the byte of data to the target */ | 		/* Wait until the NVM controller is no longer busy */ | ||||||
|  | 		if (!(TINYNVM_WaitWhileNVMControllerBusy())) | ||||||
|  | 		  return false; | ||||||
|  | 
 | ||||||
|  | 		/* Write the low byte of data to the target */ | ||||||
| 		XPROGTarget_SendByte(TPI_CMD_SST | TPI_POINTER_INDIRECT_PI); | 		XPROGTarget_SendByte(TPI_CMD_SST | TPI_POINTER_INDIRECT_PI); | ||||||
| 		XPROGTarget_SendByte(*(WriteBuffer++)); | 		XPROGTarget_SendByte(*(WriteBuffer++)); | ||||||
|  | 		 | ||||||
|  | 		/* Write the high byte of data to the target */ | ||||||
|  | 		XPROGTarget_SendByte(TPI_CMD_SST | TPI_POINTER_INDIRECT_PI); | ||||||
|  | 		XPROGTarget_SendByte(*(WriteBuffer++)); | ||||||
|  | 
 | ||||||
|  | 		/* Need to decrement the write length twice, since we read out a whole word */ | ||||||
|  | 		WriteLength -= 2; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	return true; | 	return true; | ||||||
|  | |||||||
| @ -67,9 +67,9 @@ MIME_Type_t PROGMEM MIMETypes[] = | |||||||
| 		{.Extension = "gif", .MIMEType = "image/gif"}, | 		{.Extension = "gif", .MIMEType = "image/gif"}, | ||||||
| 		{.Extension = "bmp", .MIMEType = "image/bmp"}, | 		{.Extension = "bmp", .MIMEType = "image/bmp"}, | ||||||
| 		{.Extension = "png", .MIMEType = "image/png"}, | 		{.Extension = "png", .MIMEType = "image/png"}, | ||||||
|  | 		{.Extension = "ico", .MIMEType = "image/x-icon"}, | ||||||
| 		{.Extension = "exe", .MIMEType = "application/octet-stream"}, | 		{.Extension = "exe", .MIMEType = "application/octet-stream"}, | ||||||
| 		{.Extension = "gz",  .MIMEType = "application/x-gzip"}, | 		{.Extension = "gz",  .MIMEType = "application/x-gzip"}, | ||||||
| 		{.Extension = "ico", .MIMEType = "image/x-icon"}, |  | ||||||
| 		{.Extension = "zip", .MIMEType = "application/zip"}, | 		{.Extension = "zip", .MIMEType = "application/zip"}, | ||||||
| 		{.Extension = "pdf", .MIMEType = "application/pdf"}, | 		{.Extension = "pdf", .MIMEType = "application/pdf"}, | ||||||
| 	}; | 	}; | ||||||
| @ -125,7 +125,7 @@ void WebserverApp_Callback(void) | |||||||
| 		AppState->CurrentState = AppState->NextState; | 		AppState->CurrentState = AppState->NextState; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (uip_rexmit() || uip_newdata() || uip_acked() || uip_connected() || uip_poll()) | 	if (uip_rexmit() || uip_acked() || uip_newdata() || uip_connected() || uip_poll()) | ||||||
| 	{ | 	{ | ||||||
| 		switch (AppState->CurrentState) | 		switch (AppState->CurrentState) | ||||||
| 		{ | 		{ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dean Camera
						Dean Camera