Merge branch 'master' of https://github.com/adafruit/Adafruit_nRF52_Bootloader into patch-5
This commit is contained in:
commit
15ca75d10d
@ -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));
|
||||||
|
Loading…
Reference in New Issue
Block a user