Skip to content

Commit 2a582f7

Browse files
committed
Fix stm32f4 DMA copy bug
1 parent 2233919 commit 2a582f7

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

qiling/hw/const/stm32f4xx_dma.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,14 @@ class DMA_SxM1AR(IntEnum):
146146
M1A = 0xffffffff << 0
147147

148148
class DMA(IntEnum):
149-
PERIPH_TO_MEMORY = 0
150-
MEMORY_TO_PERIPH = DMA_SxCR.DIR_0
151-
MEMORY_TO_MEMORY = DMA_SxCR.DIR_1
149+
PERIPH_TO_MEMORY = 0
150+
MEMORY_TO_PERIPH = DMA_SxCR.DIR_0
151+
MEMORY_TO_MEMORY = DMA_SxCR.DIR_1
152152

153-
PDATAALIGN_BYTE = 0
154-
PDATAALIGN_HALFWORD = DMA_SxCR.MSIZE_0
155-
PDATAALIGN_WORD = DMA_SxCR.MSIZE_1
153+
PDATAALIGN_BYTE = 0
154+
PDATAALIGN_HALFWORD = DMA_SxCR.PSIZE_0
155+
PDATAALIGN_WORD = DMA_SxCR.PSIZE_1
156+
157+
MDATAALIGN_BYTE = 0
158+
MDATAALIGN_HALFWORD = DMA_SxCR.MSIZE_0
159+
MDATAALIGN_WORD = DMA_SxCR.MSIZE_1

qiling/hw/dma/stm32f4xx_dma.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def enable(self):
2323
def transfer_direction(self):
2424
return self.CR & DMA_SxCR.DIR
2525

26-
def transfer_size(self):
26+
def transfer_peripheral_size(self):
2727
PSIZE = self.CR & DMA_SxCR.PSIZE
2828
if PSIZE == DMA.PDATAALIGN_BYTE:
2929
return 1
@@ -32,22 +32,35 @@ def transfer_size(self):
3232
if PSIZE == DMA.PDATAALIGN_WORD:
3333
return 4
3434

35+
def transfer_memory_size(self):
36+
MSIZE = self.CR & DMA_SxCR.MSIZE
37+
if MSIZE == DMA.MDATAALIGN_BYTE:
38+
return 1
39+
if MSIZE == DMA.MDATAALIGN_HALFWORD:
40+
return 2
41+
if MSIZE == DMA.MDATAALIGN_WORD:
42+
return 4
43+
3544
def step(self, mem):
3645
if self.NDTR == 0:
3746
return
3847

39-
dir_flag = self.transfer_direction() == DMA.MEMORY_TO_PERIPH
48+
dir_flag = self.transfer_direction() == DMA.MEMORY_TO_PERIPH
49+
50+
psize = self.transfer_peripheral_size()
51+
msize = self.transfer_memory_size()
4052

41-
size = self.transfer_size()
4253
src, dst = (self.M0AR, self.PAR) if dir_flag else (self.PAR, self.M0AR)
54+
src_size, dst_size = (msize, psize) if dir_flag else (psize, msize)
55+
56+
data = bytes(mem.read(src, src_size)).ljust(dst_size)[:dst_size]
57+
mem.write(dst, data)
4358

44-
mem.write(dst, bytes(mem.read(src, size)))
45-
4659
self.NDTR -= 1
4760
if self.CR & DMA_SxCR.MINC:
48-
self.M0AR += size
61+
self.M0AR += msize
4962
if self.CR & DMA_SxCR.PINC:
50-
self.PAR += size
63+
self.PAR += psize
5164

5265
if self.NDTR == 0:
5366
self.CR &= ~DMA_SxCR.EN

0 commit comments

Comments
 (0)