machine/stm32: correct Flash implementation

Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
deadprogram
2023-03-11 20:57:21 +01:00
committed by Ron Evans
parent 6c40ee93fe
commit c5598630c9
4 changed files with 14 additions and 10 deletions
+5 -1
View File
@@ -73,11 +73,15 @@ func (f flashBlockDevice) EraseBlockSize() int64 {
// transparently coalesce ranges of blocks into larger bundles if the chip
// supports this. The start and len parameters are in block numbers, use
// EraseBlockSize to map addresses to blocks.
// Note that block 0 should map to the address of FlashDataStart().
func (f flashBlockDevice) EraseBlocks(start, len int64) error {
var address uintptr = uintptr(start*f.EraseBlockSize()) + FlashDataStart()
blk := int64(address-uintptr(memoryStart)) / f.EraseBlockSize()
unlockFlash()
defer lockFlash()
for i := start; i < start+len; i++ {
for i := blk; i < blk+len; i++ {
if err := eraseBlock(uint32(i)); err != nil {
return err
}
+1 -1
View File
@@ -891,7 +891,7 @@ func writeFlashData(address uintptr, data []byte) (int, error) {
// start write operation
stm32.FLASH.SetCR_PG(1)
*(*uint16)(unsafe.Pointer(address)) = binary.BigEndian.Uint16(data[i : i+writeBlockSize])
*(*uint16)(unsafe.Pointer(address)) = binary.LittleEndian.Uint16(data[i : i+writeBlockSize])
waitUntilFlashDone()
+4 -4
View File
@@ -595,13 +595,13 @@ func writeFlashData(address uintptr, data []byte) (int, error) {
// start page write operation
stm32.FLASH.SetCR_PG(1)
// write first word using double-word low order word
*(*uint32)(unsafe.Pointer(address)) = binary.BigEndian.Uint32(data[j+writeBlockSize/2 : j+writeBlockSize])
// write second word using double-word high order word
*(*uint32)(unsafe.Pointer(address)) = binary.LittleEndian.Uint32(data[j : j+writeBlockSize/2])
address += writeBlockSize / 2
// write second word using double-word high order word
*(*uint32)(unsafe.Pointer(address)) = binary.BigEndian.Uint32(data[j : j+writeBlockSize/2])
// write first word using double-word low order word
*(*uint32)(unsafe.Pointer(address)) = binary.LittleEndian.Uint32(data[j+writeBlockSize/2 : j+writeBlockSize])
waitUntilFlashDone()
+4 -4
View File
@@ -484,13 +484,13 @@ func writeFlashData(address uintptr, data []byte) (int, error) {
// start page write operation
stm32.FLASH.SetCR_PG(1)
// write first word using double-word low order word
*(*uint32)(unsafe.Pointer(address)) = binary.BigEndian.Uint32(data[j+writeBlockSize/2 : j+writeBlockSize])
// write first word using double-word high order word
*(*uint32)(unsafe.Pointer(address)) = binary.LittleEndian.Uint32(data[j : j+writeBlockSize/2])
address += writeBlockSize / 2
// write second word using double-word high order word
*(*uint32)(unsafe.Pointer(address)) = binary.BigEndian.Uint32(data[j : j+writeBlockSize/2])
// write second word using double-word low order word
*(*uint32)(unsafe.Pointer(address)) = binary.LittleEndian.Uint32(data[j+writeBlockSize/2 : j+writeBlockSize])
waitUntilFlashDone()