Loop based controller for dual lane siemens siplace feeder.

Dependencies:   USBDevice mbed

Committer:
Issus
Date:
Sat Feb 04 01:27:29 2017 +0000
Revision:
1:4d3738338cf1
Minimum on time for cover tape pickup. Added IAP for getting mcu serial number and future eeprom use. Moved defs to .h file.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Issus 1:4d3738338cf1 1 #if defined(TARGET_LPC11UXX) | defined(TARGET_LPC11U6X)
Issus 1:4d3738338cf1 2
Issus 1:4d3738338cf1 3 #include "IAP_LPC11U.h"
Issus 1:4d3738338cf1 4
Issus 1:4d3738338cf1 5 namespace
Issus 1:4d3738338cf1 6 {
Issus 1:4d3738338cf1 7 //This data must be global so it is not read from the stack
Issus 1:4d3738338cf1 8 unsigned int m_Command[5], m_Result[5];
Issus 1:4d3738338cf1 9 typedef void (*IAP)(unsigned int [], unsigned int []);
Issus 1:4d3738338cf1 10 const IAP IAP_Entry = (IAP)0x1FFF1FF1;
Issus 1:4d3738338cf1 11 }
Issus 1:4d3738338cf1 12
Issus 1:4d3738338cf1 13 static inline void _iap_CriticalEntry()
Issus 1:4d3738338cf1 14 {
Issus 1:4d3738338cf1 15 //Disable interrupts
Issus 1:4d3738338cf1 16 __disable_irq();
Issus 1:4d3738338cf1 17
Issus 1:4d3738338cf1 18 //Safely perform IAP entry
Issus 1:4d3738338cf1 19 IAP_Entry(m_Command, m_Result);
Issus 1:4d3738338cf1 20
Issus 1:4d3738338cf1 21 //Enable interrupts
Issus 1:4d3738338cf1 22 __enable_irq();
Issus 1:4d3738338cf1 23 }
Issus 1:4d3738338cf1 24
Issus 1:4d3738338cf1 25 IapReturnCode IAP_PrepareSectors(unsigned int sector_start, unsigned int sector_end)
Issus 1:4d3738338cf1 26 {
Issus 1:4d3738338cf1 27 //Prepare the command array
Issus 1:4d3738338cf1 28 m_Command[0] = 50;
Issus 1:4d3738338cf1 29 m_Command[1] = sector_start; //The start of the sector to be prepared
Issus 1:4d3738338cf1 30 m_Command[2] = sector_end; //The end of the sector to be prepared
Issus 1:4d3738338cf1 31
Issus 1:4d3738338cf1 32 //Invoke critical IAP call...
Issus 1:4d3738338cf1 33 _iap_CriticalEntry();
Issus 1:4d3738338cf1 34
Issus 1:4d3738338cf1 35 //Extract the result code
Issus 1:4d3738338cf1 36 IapReturnCode ret = (IapReturnCode)m_Result[0];
Issus 1:4d3738338cf1 37
Issus 1:4d3738338cf1 38 //Return the result code
Issus 1:4d3738338cf1 39 return ret;
Issus 1:4d3738338cf1 40 }
Issus 1:4d3738338cf1 41
Issus 1:4d3738338cf1 42 IapReturnCode IAP_CopyRAMToFlash(void* ram_address, void* flash_address, unsigned int length)
Issus 1:4d3738338cf1 43 {
Issus 1:4d3738338cf1 44 //Prepare the command array
Issus 1:4d3738338cf1 45 m_Command[0] = 51;
Issus 1:4d3738338cf1 46 m_Command[1] = (unsigned int)flash_address; //Flash address where the contents are to be copied (it should be within 256bytes boundary)
Issus 1:4d3738338cf1 47 m_Command[2] = (unsigned int)ram_address; //RAM address to be copied (it should be in word boundary)
Issus 1:4d3738338cf1 48 m_Command[3] = length; //Number of data to be copied in bytes: 256, 512, 1024, or 4096
Issus 1:4d3738338cf1 49 m_Command[4] = SystemCoreClock / 1000;
Issus 1:4d3738338cf1 50
Issus 1:4d3738338cf1 51 //Invoke critical IAP call...
Issus 1:4d3738338cf1 52 _iap_CriticalEntry();
Issus 1:4d3738338cf1 53
Issus 1:4d3738338cf1 54 //Extract the result code
Issus 1:4d3738338cf1 55 IapReturnCode ret = (IapReturnCode)m_Result[0];
Issus 1:4d3738338cf1 56
Issus 1:4d3738338cf1 57 //Return the result code
Issus 1:4d3738338cf1 58 return ret;
Issus 1:4d3738338cf1 59 }
Issus 1:4d3738338cf1 60
Issus 1:4d3738338cf1 61 IapReturnCode IAP_EraseSectors(unsigned int sector_start, unsigned int sector_end)
Issus 1:4d3738338cf1 62 {
Issus 1:4d3738338cf1 63 //Prepare the command array
Issus 1:4d3738338cf1 64 m_Command[0] = 52;
Issus 1:4d3738338cf1 65 m_Command[1] = sector_start; //The start of the sector to be erased
Issus 1:4d3738338cf1 66 m_Command[2] = sector_end; //The end of the sector to be erased
Issus 1:4d3738338cf1 67 m_Command[3] = SystemCoreClock / 1000; //System Clock Frequency (CCLK) in kHz
Issus 1:4d3738338cf1 68
Issus 1:4d3738338cf1 69 //Invoke critical IAP call...
Issus 1:4d3738338cf1 70 _iap_CriticalEntry();
Issus 1:4d3738338cf1 71
Issus 1:4d3738338cf1 72 //Extract the result code
Issus 1:4d3738338cf1 73 IapReturnCode ret = (IapReturnCode)m_Result[0];
Issus 1:4d3738338cf1 74
Issus 1:4d3738338cf1 75 //Return the result code
Issus 1:4d3738338cf1 76 return ret;
Issus 1:4d3738338cf1 77 }
Issus 1:4d3738338cf1 78
Issus 1:4d3738338cf1 79 IapReturnCode IAP_BlankCheckSectors(unsigned int sector_start, unsigned int sector_end)
Issus 1:4d3738338cf1 80 {
Issus 1:4d3738338cf1 81 //Prepare the command array
Issus 1:4d3738338cf1 82 m_Command[0] = 53;
Issus 1:4d3738338cf1 83 m_Command[1] = sector_start; //The start of the sector to be checked
Issus 1:4d3738338cf1 84 m_Command[2] = sector_end; //The end of the sector to be checked
Issus 1:4d3738338cf1 85
Issus 1:4d3738338cf1 86 //Invoke critical IAP call...
Issus 1:4d3738338cf1 87 _iap_CriticalEntry();
Issus 1:4d3738338cf1 88
Issus 1:4d3738338cf1 89 //Extract the result code
Issus 1:4d3738338cf1 90 IapReturnCode ret = (IapReturnCode)m_Result[0];
Issus 1:4d3738338cf1 91
Issus 1:4d3738338cf1 92 //Return the result code
Issus 1:4d3738338cf1 93 return ret;
Issus 1:4d3738338cf1 94 }
Issus 1:4d3738338cf1 95
Issus 1:4d3738338cf1 96 unsigned int IAP_ReadPartID()
Issus 1:4d3738338cf1 97 {
Issus 1:4d3738338cf1 98 //Prepare the command array
Issus 1:4d3738338cf1 99 m_Command[0] = 54;
Issus 1:4d3738338cf1 100
Issus 1:4d3738338cf1 101 //Invoke critical IAP call...
Issus 1:4d3738338cf1 102 _iap_CriticalEntry();
Issus 1:4d3738338cf1 103
Issus 1:4d3738338cf1 104 //Extract the part ID
Issus 1:4d3738338cf1 105 unsigned int ret = m_Result[1];
Issus 1:4d3738338cf1 106
Issus 1:4d3738338cf1 107 //Return the part ID
Issus 1:4d3738338cf1 108 return ret;
Issus 1:4d3738338cf1 109 }
Issus 1:4d3738338cf1 110
Issus 1:4d3738338cf1 111 unsigned short IAP_ReadBootCodeVersion()
Issus 1:4d3738338cf1 112 {
Issus 1:4d3738338cf1 113 //Prepare the command array
Issus 1:4d3738338cf1 114 m_Command[0] = 55;
Issus 1:4d3738338cf1 115
Issus 1:4d3738338cf1 116 //Invoke critical IAP call...
Issus 1:4d3738338cf1 117 _iap_CriticalEntry();
Issus 1:4d3738338cf1 118
Issus 1:4d3738338cf1 119 //Extract the boot code version
Issus 1:4d3738338cf1 120 unsigned int ret = (unsigned short)m_Result[1];
Issus 1:4d3738338cf1 121
Issus 1:4d3738338cf1 122 //Return the boot code version
Issus 1:4d3738338cf1 123 return ret;
Issus 1:4d3738338cf1 124 }
Issus 1:4d3738338cf1 125
Issus 1:4d3738338cf1 126 IapReturnCode IAP_Compare(void* address1, void* address2, unsigned int bytes)
Issus 1:4d3738338cf1 127 {
Issus 1:4d3738338cf1 128 //Prepare the command array
Issus 1:4d3738338cf1 129 m_Command[0] = 56;
Issus 1:4d3738338cf1 130 m_Command[1] = (unsigned int)address1; //Starting flash or RAM address of data bytes to be compared. This address should be a word boundary.
Issus 1:4d3738338cf1 131 m_Command[2] = (unsigned int)address2; //Starting flash or RAM address of data bytes to be compared. This address should be a word boundary.
Issus 1:4d3738338cf1 132 m_Command[3] = bytes; //Number of bytes to be compared; should be a multiple of 4.
Issus 1:4d3738338cf1 133
Issus 1:4d3738338cf1 134 //Invoke critical IAP call...
Issus 1:4d3738338cf1 135 _iap_CriticalEntry();
Issus 1:4d3738338cf1 136
Issus 1:4d3738338cf1 137 //Extract the result code
Issus 1:4d3738338cf1 138 IapReturnCode ret = (IapReturnCode)m_Result[0];
Issus 1:4d3738338cf1 139
Issus 1:4d3738338cf1 140 //Return the result code
Issus 1:4d3738338cf1 141 return ret;
Issus 1:4d3738338cf1 142 }
Issus 1:4d3738338cf1 143
Issus 1:4d3738338cf1 144 /* This function resets some microcontroller peripherals to reset
Issus 1:4d3738338cf1 145 * hardware configuration to ensure that the USB In-System Programming module
Issus 1:4d3738338cf1 146 * will work properly. It is normally called from reset and assumes some reset
Issus 1:4d3738338cf1 147 * configuration settings for the MCU.
Issus 1:4d3738338cf1 148 * Some of the peripheral configurations may be redundant in your specific
Issus 1:4d3738338cf1 149 * project.
Issus 1:4d3738338cf1 150 */
Issus 1:4d3738338cf1 151 void IAP_ReinvokeISP()
Issus 1:4d3738338cf1 152 {
Issus 1:4d3738338cf1 153 //Make sure USB clock is turned on before calling ISP
Issus 1:4d3738338cf1 154 //LPC_SYSCON->SYSAHBCLKCTRL |= 0x04000;
Issus 1:4d3738338cf1 155
Issus 1:4d3738338cf1 156 //Make sure 32-bit Timer 1 is turned on before calling ISP
Issus 1:4d3738338cf1 157 //LPC_SYSCON->SYSAHBCLKCTRL |= 0x00400;
Issus 1:4d3738338cf1 158
Issus 1:4d3738338cf1 159 //Make sure GPIO clock is turned on before calling ISP
Issus 1:4d3738338cf1 160 LPC_SYSCON->SYSAHBCLKCTRL |= 0x00040;
Issus 1:4d3738338cf1 161
Issus 1:4d3738338cf1 162 //Make sure IO configuration clock is turned on before calling ISP
Issus 1:4d3738338cf1 163 //LPC_SYSCON->SYSAHBCLKCTRL |= 0x10000;
Issus 1:4d3738338cf1 164
Issus 1:4d3738338cf1 165 #if defined(TARGET_LPC11U6X)
Issus 1:4d3738338cf1 166 //Set the vector table offset to address 0
Issus 1:4d3738338cf1 167 SCB->VTOR = 0;
Issus 1:4d3738338cf1 168 #endif
Issus 1:4d3738338cf1 169
Issus 1:4d3738338cf1 170 //Make sure AHB clock divider is 1:1
Issus 1:4d3738338cf1 171 LPC_SYSCON->SYSAHBCLKDIV = 1;
Issus 1:4d3738338cf1 172
Issus 1:4d3738338cf1 173 //Prepare the command array
Issus 1:4d3738338cf1 174 m_Command[0] = 57;
Issus 1:4d3738338cf1 175
Issus 1:4d3738338cf1 176 //Initialize the storage state machine
Issus 1:4d3738338cf1 177 //*((unsigned int*)(0x10000054)) = 0x0;
Issus 1:4d3738338cf1 178
Issus 1:4d3738338cf1 179 //Set stack pointer to ROM value (reset default)
Issus 1:4d3738338cf1 180 //This must be the last piece of code executed before calling ISP,
Issus 1:4d3738338cf1 181 //because most C expressions and function returns will fail after the stack pointer is changed.
Issus 1:4d3738338cf1 182 //__set_MSP(*((unsigned int*)0x00000000));
Issus 1:4d3738338cf1 183
Issus 1:4d3738338cf1 184 //Invoke IAP call...
Issus 1:4d3738338cf1 185 IAP_Entry(m_Command, m_Result);
Issus 1:4d3738338cf1 186
Issus 1:4d3738338cf1 187 //Shouldn't return
Issus 1:4d3738338cf1 188 }
Issus 1:4d3738338cf1 189
Issus 1:4d3738338cf1 190 UID IAP_ReadUID()
Issus 1:4d3738338cf1 191 {
Issus 1:4d3738338cf1 192 //Prepare the command array
Issus 1:4d3738338cf1 193 m_Command[0] = 58;
Issus 1:4d3738338cf1 194
Issus 1:4d3738338cf1 195 //Invoke critical IAP call...
Issus 1:4d3738338cf1 196 _iap_CriticalEntry();
Issus 1:4d3738338cf1 197
Issus 1:4d3738338cf1 198 //Extract the UID
Issus 1:4d3738338cf1 199 UID ret = {
Issus 1:4d3738338cf1 200 m_Result[1],
Issus 1:4d3738338cf1 201 m_Result[2],
Issus 1:4d3738338cf1 202 m_Result[3],
Issus 1:4d3738338cf1 203 m_Result[4]
Issus 1:4d3738338cf1 204 };
Issus 1:4d3738338cf1 205
Issus 1:4d3738338cf1 206 //Return the UID
Issus 1:4d3738338cf1 207 return ret;
Issus 1:4d3738338cf1 208 }
Issus 1:4d3738338cf1 209
Issus 1:4d3738338cf1 210 IapReturnCode IAP_ErasePage(unsigned int page_start, unsigned int page_end)
Issus 1:4d3738338cf1 211 {
Issus 1:4d3738338cf1 212 //Prepare the command array
Issus 1:4d3738338cf1 213 m_Command[0] = 59;
Issus 1:4d3738338cf1 214 m_Command[1] = page_start; //The start of the page to be erased
Issus 1:4d3738338cf1 215 m_Command[2] = page_end; //The end of the page to be erased
Issus 1:4d3738338cf1 216 m_Command[3] = SystemCoreClock / 1000; //System Clock Frequency (CCLK) in kHz
Issus 1:4d3738338cf1 217
Issus 1:4d3738338cf1 218 //Invoke critical IAP call...
Issus 1:4d3738338cf1 219 _iap_CriticalEntry();
Issus 1:4d3738338cf1 220
Issus 1:4d3738338cf1 221 //Extract the result code
Issus 1:4d3738338cf1 222 IapReturnCode ret = (IapReturnCode)m_Result[0];
Issus 1:4d3738338cf1 223
Issus 1:4d3738338cf1 224 //Return the result code
Issus 1:4d3738338cf1 225 return ret;
Issus 1:4d3738338cf1 226 }
Issus 1:4d3738338cf1 227
Issus 1:4d3738338cf1 228 IapReturnCode IAP_WriteEEPROM(unsigned int ee_address, char* buffer, unsigned int length)
Issus 1:4d3738338cf1 229 {
Issus 1:4d3738338cf1 230 //Prepare the command array
Issus 1:4d3738338cf1 231 m_Command[0] = 61;
Issus 1:4d3738338cf1 232 m_Command[1] = ee_address; //EEPROM address (byte, half-word or word aligned)
Issus 1:4d3738338cf1 233 m_Command[2] = (unsigned int)buffer; //RAM address (byte, half-word or word aligned)
Issus 1:4d3738338cf1 234 m_Command[3] = length; //Number of bytes to be written (byte, half-word writes are ok)
Issus 1:4d3738338cf1 235 m_Command[4] = SystemCoreClock / 1000; //System Clock Frequency (CCLK) in kHz
Issus 1:4d3738338cf1 236
Issus 1:4d3738338cf1 237 //Invoke critical IAP call...
Issus 1:4d3738338cf1 238 _iap_CriticalEntry();
Issus 1:4d3738338cf1 239
Issus 1:4d3738338cf1 240 //Extract the result code
Issus 1:4d3738338cf1 241 IapReturnCode ret = (IapReturnCode)m_Result[0];
Issus 1:4d3738338cf1 242
Issus 1:4d3738338cf1 243 //Return the result code
Issus 1:4d3738338cf1 244 return ret;
Issus 1:4d3738338cf1 245 }
Issus 1:4d3738338cf1 246
Issus 1:4d3738338cf1 247 IapReturnCode IAP_ReadEEPROM(unsigned int ee_address, char* buffer, unsigned int length)
Issus 1:4d3738338cf1 248 {
Issus 1:4d3738338cf1 249 //Prepare the command array
Issus 1:4d3738338cf1 250 m_Command[0] = 62;
Issus 1:4d3738338cf1 251 m_Command[1] = ee_address; //EEPROM address (byte, half-word or word aligned)
Issus 1:4d3738338cf1 252 m_Command[2] = (unsigned int)buffer; //RAM address (byte, half-word or word aligned)
Issus 1:4d3738338cf1 253 m_Command[3] = length; //Number of bytes to be read (byte, half-word reads are ok)
Issus 1:4d3738338cf1 254 m_Command[4] = SystemCoreClock / 1000; //System Clock Frequency (CCLK) in kHz
Issus 1:4d3738338cf1 255
Issus 1:4d3738338cf1 256 //Invoke critical IAP call...
Issus 1:4d3738338cf1 257 _iap_CriticalEntry();
Issus 1:4d3738338cf1 258
Issus 1:4d3738338cf1 259 //Extract the result code
Issus 1:4d3738338cf1 260 IapReturnCode ret = (IapReturnCode)m_Result[0];
Issus 1:4d3738338cf1 261
Issus 1:4d3738338cf1 262 //Return the result code
Issus 1:4d3738338cf1 263 return ret;
Issus 1:4d3738338cf1 264 }
Issus 1:4d3738338cf1 265
Issus 1:4d3738338cf1 266 #endif