Skip to content

ccloader can not work with the Arduino 168p. Patch. #29

@1yura

Description

@1yura

Ccloader can not work with the Arduino with 168p microcontrоller due lack of the RAM. This Patch resolve this issue. After uploading sketch to the Arduino there is need to disconnect DTR -> Reset (if it used).

--- CCLoader.ino	2020-11-19 10:21:59.000000000 +0300
+++ ccloader168.ino	2020-11-19 11:29:07.000000000 +0300
@@ -452,6 +452,47 @@
 }
 
 /**************************************************************************//**
+* @brief    Verify 1-32767 bytes from DUP's flash against a given buffer on the
+*           programmer.
+* @param    bank        Flash bank to read from [0-7]
+* @param    address     Flash memory start address [0x0000 - 0x7FFF]
+* @param    values      Pointer to destination buffer.
+* @return   Error. Zero if no errors
+******************************************************************************/
+unsigned char verify_flash_memory_block(unsigned char bank,unsigned short flash_addr,
+                             unsigned short num_bytes, unsigned const char *values)
+{
+    unsigned char instr[3];
+    unsigned short i;
+    unsigned short xdata_addr = (0x8000 + flash_addr);
+    unsigned char err = 0;
+    unsigned char val;
+
+    // 1. Map flash memory bank to XDATA address 0x8000-0xFFFF
+    write_xdata_memory(DUP_MEMCTR, bank);
+
+    // 2. Move data pointer to XDATA address (MOV DPTR, xdata_addr)
+    instr[0] = 0x90;
+    instr[1] = HIBYTE(xdata_addr);
+    instr[2] = LOBYTE(xdata_addr);
+    debug_command(CMD_DEBUG_INSTR_3B, instr, 3);
+
+    for (i = 0; i < num_bytes; i++)
+    {
+        // 3. Move value pointed to by DPTR to accumulator (MOVX A, @DPTR)
+        instr[0] = 0xE0;
+        val = debug_command(CMD_DEBUG_INSTR_1B, instr, 1);
+        err = values[i] != val ? 1 : err;
+
+        // 4. Increment data pointer (INC DPTR)
+        instr[0] = 0xA3;
+        debug_command(CMD_DEBUG_INSTR_1B, instr, 1);
+    }
+    
+    return err;
+}
+
+/**************************************************************************//**
 * @brief    Writes 4-2048 bytes to DUP's flash memory. Parameter \c num_bytes
 *           must be a multiple of 4.
 * @param    src         Pointer to programmer's source buffer (in XDATA space)
@@ -526,9 +567,11 @@
   Serial.begin(115200);
   // If using Leonado as programmer, 
   //it should add below code,otherwise,comment it.
-  while(!Serial);
+  // while(!Serial);
 }
 
+unsigned char  rxBuf[514]; 
+
 void loop() 
 {
   unsigned char chip_id = 0;
@@ -536,6 +579,13 @@
   unsigned char Continue = 0;
   unsigned char Verify = 0;
   
+  for (unsigned char j = 0; j < 3; j++){
+    digitalWrite(LED, HIGH);
+    delay(50);
+    digitalWrite(LED, LOW);
+    delay(50);
+  }
+
   while(!Continue)     // Wait for starting
   {  
     
@@ -583,7 +633,6 @@
   digitalWrite(LED, HIGH);  
   unsigned char Done = 0;
   unsigned char State = WAITING;
-  unsigned char  rxBuf[514]; 
   unsigned int BufIndex = 0;
   unsigned int addr = 0x0000;
   while(!Done)
@@ -633,18 +682,25 @@
             {
               unsigned char bank = addr / (512 * 16);
               unsigned int  offset = (addr % (512 * 16)) * 4;
-              unsigned char read_data[512];
-              read_flash_memory_block(bank, offset, 512, read_data); // Bank, address, count, dest.            
-              for(unsigned int i = 0; i < 512; i++) 
-              {
-                if(read_data[i] != rxBuf[i]) 
-                {
-                  // Fail
+              // unsigned char read_data[512];
+              // read_flash_memory_block(bank, offset, 512, read_data); // Bank, address, count, dest.            
+              // for(unsigned int i = 0; i < 512; i++) 
+              // {
+              //   if(read_data[i] != rxBuf[i]) 
+              //   {
+              //     // Fail
+              //     State = WAITING;
+              //     Serial.write(ERRO);                    
+              //     chip_erase();
+              //     return;
+              //   }
+              // }
+              unsigned char err = verify_flash_memory_block(bank, offset, 512, rxBuf);
+              if (err) {
                   State = WAITING;
                   Serial.write(ERRO);                    
                   chip_erase();
                   return;
-                }
               }
             }
             addr += (unsigned int)128;              

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions