machine/stm32: correct Flash implementation
Signed-off-by: deadprogram <ron@hybridgroup.com>
Этот коммит содержится в:
родитель
6c40ee93fe
коммит
c5598630c9
4 изменённых файлов: 14 добавлений и 10 удалений
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче