-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathdma_param.sh
More file actions
109 lines (92 loc) · 3.14 KB
/
Copy pathdma_param.sh
File metadata and controls
109 lines (92 loc) · 3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# XDMA device
dev="/dev/xdma0_user"
# Executable file path
tools="external/dma_ip_drivers/XDMA/linux-kernel/tools"
#--------------------- Parameter definition ---------------------#
# DMA IP register base address
DMA_BASE=$((0x60000))
# Descriptor address (64-byte aligned)
BRAM_BASE=$((0x20000))
XDMA_BIAS=$((0x44a00000))
DMA_DESC0=$((BRAM_BASE + 0))
DMA_DESC1=$((BRAM_BASE + 64))
DMA_DESC2=$((BRAM_BASE + 128))
DMA_DESC3=$((BRAM_BASE + 192))
# DDR Buffer address
DDR_BASE=$((0x80000000))
BUFFER_SIZE=$((2048))
BUFFER_ADDR0=$((DDR_BASE + 0))
BUFFER_ADDR1=$((DDR_BASE + BUFFER_SIZE))
#--------------------- DMA register control ---------------------#
# MM2S channel register offset (C2H)
MM2S_DMACR=$((DMA_BASE + 0x00))
MM2S_DMASR=$((DMA_BASE + 0x04))
MM2S_CURDESC=$((DMA_BASE + 0x08))
MM2S_TAILDESC=$((DMA_BASE + 0x10))
# S2MM channel register offset (H2C)
S2MM_DMACR=$((DMA_BASE + 0x30))
S2MM_DMASR=$((DMA_BASE + 0x34))
S2MM_CURDESC=$((DMA_BASE + 0x38))
S2MM_TAILDESC=$((DMA_BASE + 0x40))
#--------------------- Mask definition ---------------------#
# Descriptor mask
SOF_MASK=$((1 << 27)) # TXSOF/RXSOF (Start of Frame)
EOF_MASK=$((1 << 26)) # TXEOF/RXEOF (End of Frame)
# Control mask
RS_MASK=$((1 << 0)) # DMACR.RS bit
RESET_MASK=$((1 << 2)) # DMACR.Reset bit
# Status mask
IDLE_MASK=$((1 << 1)) # DMASR.Idle bit
HALTED_MASK=$((1 << 0)) # DMASR.Halted bit
ERROR_MASK=$(( (0x7 << 4) | (0x7 << 8) ))
#--------------------- Register read/write functions ---------------------#
reg_read() {
local addr_dec=$1
local addr_hex
local reg_read_hex
local reg_read_dec
addr_hex=$(printf "0x%x" "$addr_dec")
echo -n "call \"reg_rw $dev $addr_hex w\" " >&2
reg_read_hex=$("$tools/reg_rw" "$dev" "$addr_hex" w | awk '/Read 32-bit value/ {print $NF}')
reg_read_dec=$(printf "%d" "$reg_read_hex")
echo "- return $reg_read_hex" >&2
echo "$reg_read_dec"
}
reg_write() {
local addr_dec=$1
local val_dec=$2
local addr_hex
local val_hex
local err
addr_hex=$(printf "0x%x" "$addr_dec")
val_hex=$(printf "0x%x" "$val_dec")
echo "call \"reg_rw $dev $addr_hex w $val_hex\""
err=$("$tools/reg_rw" "$dev" "$addr_hex" w "$val_hex")
}
#--------------------- Error handling function ---------------------#
check_dma_error() {
local dmasr=$1
if [ $((dmasr & ERROR_MASK)) -ne 0 ]; then
echo "\033[31m[Error] Wrong status register value: 0x$(printf '%08x' $dmasr)\033[0m"
# Analyze the specific error bit
if [ $((dmasr & (1 << 4))) -ne 0 ]; then
echo "- DMAIntErr: DMA internal error"
fi
if [ $((dmasr & (1 << 5))) -ne 0 ]; then
echo "- DMASlvErr: AXI slave error"
fi
if [ $((dmasr & (1 << 6))) -ne 0 ]; then
echo "- DMADecErr: Address decode error"
fi
if [ $((dmasr & (1 << 8))) -ne 0 ]; then
echo "- SGIntErr: Descriptor complete bit error"
fi
if [ $((dmasr & (1 << 9))) -ne 0 ]; then
echo "- SGSlvErr: SG AXI slave error"
fi
if [ $((dmasr & (1 << 10))) -ne 0 ]; then
echo "- SGDecErr: SG address decode error"
fi
exit 1
fi
}