Merge branch 'master' of https://github.com/adafruit/Adafruit_nRF52_Bootloader into patch-5
This commit is contained in:
		@@ -63,7 +63,8 @@ int write_block(uint32_t block_no, uint8_t *data, bool quiet, WriteState *state)
 | 
				
			|||||||
int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, uint16_t bufsize)
 | 
					int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, uint16_t bufsize)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  void const* response = NULL;
 | 
					  void const* response = NULL;
 | 
				
			||||||
  uint16_t resplen = 0;
 | 
					  int32_t resplen = 0;
 | 
				
			||||||
 | 
					  memset(buffer, 0, bufsize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch ( scsi_cmd[0] )
 | 
					  switch ( scsi_cmd[0] )
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@@ -98,7 +99,7 @@ int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer,
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // return len must not larger than bufsize
 | 
					  // return len must not larger than bufsize
 | 
				
			||||||
  if ( resplen > bufsize ) resplen = bufsize;
 | 
					  if ( resplen > (int32_t)bufsize ) resplen = bufsize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // copy response to stack's buffer if any
 | 
					  // copy response to stack's buffer if any
 | 
				
			||||||
  if ( response && resplen )
 | 
					  if ( response && resplen )
 | 
				
			||||||
@@ -114,6 +115,7 @@ int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer,
 | 
				
			|||||||
int32_t tud_msc_read10_cb (uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
 | 
					int32_t tud_msc_read10_cb (uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  (void) lun;
 | 
					  (void) lun;
 | 
				
			||||||
 | 
					  memset(buffer, 0, bufsize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // since we return block size each, offset should always be zero
 | 
					  // since we return block size each, offset should always be zero
 | 
				
			||||||
  TU_ASSERT(offset == 0, -1);
 | 
					  TU_ASSERT(offset == 0, -1);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -110,6 +110,7 @@ static FAT_BootBlock const BootBlock = {
 | 
				
			|||||||
    .SectorsPerFAT        = SECTORS_PER_FAT,
 | 
					    .SectorsPerFAT        = SECTORS_PER_FAT,
 | 
				
			||||||
    .SectorsPerTrack      = 1,
 | 
					    .SectorsPerTrack      = 1,
 | 
				
			||||||
    .Heads                = 1,
 | 
					    .Heads                = 1,
 | 
				
			||||||
 | 
						.PhysicalDriveNum     = 0x80, // to match MediaDescriptor of 0xF8
 | 
				
			||||||
    .ExtendedBootSig      = 0x29,
 | 
					    .ExtendedBootSig      = 0x29,
 | 
				
			||||||
    .VolumeSerialNumber   = 0x00420042,
 | 
					    .VolumeSerialNumber   = 0x00420042,
 | 
				
			||||||
    .VolumeLabel          = VOLUME_LABEL,
 | 
					    .VolumeLabel          = VOLUME_LABEL,
 | 
				
			||||||
@@ -123,35 +124,37 @@ static FAT_BootBlock const BootBlock = {
 | 
				
			|||||||
static uint32_t current_flash_size(void)
 | 
					static uint32_t current_flash_size(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  static uint32_t flash_sz = 0;
 | 
					  static uint32_t flash_sz = 0;
 | 
				
			||||||
 | 
					  uint32_t result = flash_sz; // presumes atomic 32-bit read/write and static result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // only need to compute once
 | 
					  // only need to compute once
 | 
				
			||||||
  if ( flash_sz == 0 )
 | 
					  if ( result == 0 )
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    // return 1 block of 256 bytes
 | 
					    // return 1 block of 256 bytes
 | 
				
			||||||
    if ( !bootloader_app_is_valid(DFU_BANK_0_REGION_START) )
 | 
					    if ( !bootloader_app_is_valid(DFU_BANK_0_REGION_START) )
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      flash_sz = 256;
 | 
					      result = 256;
 | 
				
			||||||
    }else
 | 
					    }else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      bootloader_settings_t const * boot_setting;
 | 
					      bootloader_settings_t const * boot_setting;
 | 
				
			||||||
      bootloader_util_settings_get(&boot_setting);
 | 
					      bootloader_util_settings_get(&boot_setting);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      flash_sz = boot_setting->bank_0_size;
 | 
					      result = boot_setting->bank_0_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Copy size must be multiple of 256 bytes
 | 
					      // Copy size must be multiple of 256 bytes
 | 
				
			||||||
      // else we will got an issue copying current.uf2
 | 
					      // else we will got an issue copying current.uf2
 | 
				
			||||||
      if (flash_sz & 0xff)
 | 
					      if (result & 0xff)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        flash_sz = (flash_sz & ~0xff) + 256;
 | 
					        result = (result & ~0xff) + 256;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // if bank0 size is not valid, happens when flashed with jlink
 | 
					      // if bank0 size is not valid, happens when flashed with jlink
 | 
				
			||||||
      // use maximum application size
 | 
					      // use maximum application size
 | 
				
			||||||
      if ( (flash_sz == 0) || (flash_sz == 0xFFFFFFFFUL) )
 | 
					      if ( (result == 0) || (result == 0xFFFFFFFFUL) )
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        flash_sz = FLASH_SIZE;
 | 
					        result = FLASH_SIZE;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    flash_sz = result; // presumes atomic 32-bit read/write and static result
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return flash_sz;
 | 
					  return flash_sz;
 | 
				
			||||||
@@ -176,30 +179,30 @@ void read_block(uint32_t block_no, uint8_t *data) {
 | 
				
			|||||||
    memset(data, 0, 512);
 | 
					    memset(data, 0, 512);
 | 
				
			||||||
    uint32_t sectionIdx = block_no;
 | 
					    uint32_t sectionIdx = block_no;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (block_no == 0) {
 | 
					    if (block_no == 0) { // Requested boot block
 | 
				
			||||||
        memcpy(data, &BootBlock, sizeof(BootBlock));
 | 
					        memcpy(data, &BootBlock, sizeof(BootBlock));
 | 
				
			||||||
        data[510] = 0x55;
 | 
					        data[510] = 0x55;
 | 
				
			||||||
        data[511] = 0xaa;
 | 
					        data[511] = 0xaa;
 | 
				
			||||||
        // logval("data[0]", data[0]);
 | 
					        // logval("data[0]", data[0]);
 | 
				
			||||||
    } else if (block_no < START_ROOTDIR) {
 | 
					    } else if (block_no < START_ROOTDIR) {  // Requested FAT table sector
 | 
				
			||||||
        sectionIdx -= START_FAT0;
 | 
					        sectionIdx -= START_FAT0;
 | 
				
			||||||
        // logval("sidx", sectionIdx);
 | 
					        // logval("sidx", sectionIdx);
 | 
				
			||||||
        if (sectionIdx >= SECTORS_PER_FAT)
 | 
					        if (sectionIdx >= SECTORS_PER_FAT)
 | 
				
			||||||
            sectionIdx -= SECTORS_PER_FAT;
 | 
					            sectionIdx -= SECTORS_PER_FAT; // second FAT is same as the first...
 | 
				
			||||||
        if (sectionIdx == 0) {
 | 
					        if (sectionIdx == 0) {
 | 
				
			||||||
            data[0] = 0xf0;
 | 
					            data[0] = 0xf8; // first FAT entry must match BPB MediaDescriptor
 | 
				
			||||||
            for (int i = 1; i < NUM_INFO * 2 + 4; ++i) {
 | 
					            for (int i = 1; i < NUM_INFO * 2 + 4; ++i) {
 | 
				
			||||||
                data[i] = 0xff;
 | 
					                data[i] = 0xff;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        for (int i = 0; i < 256; ++i) {
 | 
					        for (int i = 0; i < 256; ++i) { // Generate the FAT chain for the firmware "file"
 | 
				
			||||||
            uint32_t v = sectionIdx * 256 + i;
 | 
					            uint32_t v = sectionIdx * 256 + i;
 | 
				
			||||||
            if (UF2_FIRST_SECTOR <= v && v <= UF2_LAST_SECTOR)
 | 
					            if (UF2_FIRST_SECTOR <= v && v <= UF2_LAST_SECTOR)
 | 
				
			||||||
                ((uint16_t *)(void *)data)[i] = v == UF2_LAST_SECTOR ? 0xffff : v + 1;
 | 
					                ((uint16_t *)(void *)data)[i] = v == UF2_LAST_SECTOR ? 0xffff : v + 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else if (block_no < START_CLUSTERS) {
 | 
					    } else if (block_no < START_CLUSTERS) { // Requested root directory sector
 | 
				
			||||||
        sectionIdx -= START_ROOTDIR;
 | 
					        sectionIdx -= START_ROOTDIR;
 | 
				
			||||||
        if (sectionIdx == 0) {
 | 
					        if (sectionIdx == 0) { // only one sector of directory entries generated
 | 
				
			||||||
            DirEntry *d = (void *)data;
 | 
					            DirEntry *d = (void *)data;
 | 
				
			||||||
            padded_memcpy(d->name, (char const *) BootBlock.VolumeLabel, 11);
 | 
					            padded_memcpy(d->name, (char const *) BootBlock.VolumeLabel, 11);
 | 
				
			||||||
            d->attrs = 0x28;
 | 
					            d->attrs = 0x28;
 | 
				
			||||||
@@ -209,9 +212,9 @@ void read_block(uint32_t block_no, uint8_t *data) {
 | 
				
			|||||||
                d->size = inf->content ? strlen(inf->content) : UF2_SIZE;
 | 
					                d->size = inf->content ? strlen(inf->content) : UF2_SIZE;
 | 
				
			||||||
                d->startCluster = i + 2;
 | 
					                d->startCluster = i + 2;
 | 
				
			||||||
                padded_memcpy(d->name, inf->name, 11);
 | 
					                padded_memcpy(d->name, inf->name, 11);
 | 
				
			||||||
            }
 | 
								}
 | 
				
			||||||
        }
 | 
							}
 | 
				
			||||||
    } else {
 | 
					    } else { // else Generate the UF2 file data on-the-fly
 | 
				
			||||||
        sectionIdx -= START_CLUSTERS;
 | 
					        sectionIdx -= START_CLUSTERS;
 | 
				
			||||||
        if (sectionIdx < NUM_INFO - 1) {
 | 
					        if (sectionIdx < NUM_INFO - 1) {
 | 
				
			||||||
            memcpy(data, info[sectionIdx].content, strlen(info[sectionIdx].content));
 | 
					            memcpy(data, info[sectionIdx].content, strlen(info[sectionIdx].content));
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user