|
2 | 2 |
|
3 | 3 | namespace core::io { |
4 | 4 |
|
5 | | -FMC::FMC(const FMCPinConfig& pin_config, const SdramInitConfig& sdramInitConfig, const SdramTimingConfig& sdramTimingConfig) : |
6 | | -sdramDevice(*sdramInitConfig.sdramDevice), |
7 | | -sdBank(sdramInitConfig.sdBank), |
8 | | -columnBitsNumber(sdramInitConfig.columnBitsNumber), |
9 | | -rowBitsNumber(sdramInitConfig.rowBitsNumber), |
10 | | -memoryDataWidth(sdramInitConfig.memoryDataWidth), |
11 | | -internalBankNumber(sdramInitConfig.internalBankNumber), |
12 | | -casLatency(sdramInitConfig.casLatency), |
13 | | -writeProtection(sdramInitConfig.writeProtection), |
14 | | -sdClockPeriod(sdramInitConfig.sdClockPeriod), |
15 | | -readBurst(sdramInitConfig.readBurst), |
16 | | -readPipeDelay(sdramInitConfig.readPipeDelay), |
17 | | -loadToActiveDelay(sdramTimingConfig.loadToActiveDelay), |
18 | | -exitSelfRefreshDelay(sdramTimingConfig.exitSelfRefreshDelay), |
19 | | -selfRefreshTime(sdramTimingConfig.selfRefreshTime), |
20 | | -rowCycleDelay(sdramTimingConfig.rowCycleDelay), |
21 | | -writeRecoveryTime(sdramTimingConfig.writeRecoveryTime), |
22 | | -rpDelay(sdramTimingConfig.rpDelay), |
23 | | -rcdDelay(sdramTimingConfig.rcdDelay) { |
24 | | - InitHardware(pin_config); |
25 | | - |
26 | | - sdram = {0}; |
27 | | - sdramTiming = {0}; |
| 5 | +FMC::FMC(const FMCPinConfig& pinConfig, const SdramInitConfig& sdramInitConfig, const SdramTimingConfig& sdramTimingConfig) : |
| 6 | +sdramInitConfig(sdramInitConfig), |
| 7 | +sdramTimingConfig(sdramTimingConfig), |
| 8 | +sdram({nullptr}), |
| 9 | +sdramTiming({0}) { |
| 10 | + InitHardware(pinConfig); |
28 | 11 |
|
29 | 12 | // map the class init structs to the hal structs |
30 | 13 | sdram.Instance = sdramInitConfig.sdramDevice; |
31 | 14 | sdram.Init.SDBank = sdramInitConfig.sdBank; |
32 | | - sdram.Init.ColumnBitsNumber = columnBitsNumber; |
33 | | - sdram.Init.RowBitsNumber = rowBitsNumber; |
34 | | - sdram.Init.MemoryDataWidth = memoryDataWidth; |
35 | | - sdram.Init.InternalBankNumber = internalBankNumber; |
36 | | - sdram.Init.WriteProtection = writeProtection; |
37 | | - sdram.Init.ReadBurst = readBurst; |
38 | | - sdram.Init.ReadPipeDelay = readPipeDelay; |
39 | | - |
40 | | - sdramTiming.LoadToActiveDelay = loadToActiveDelay; |
41 | | - sdramTiming.ExitSelfRefreshDelay = exitSelfRefreshDelay; |
42 | | - sdramTiming.SelfRefreshTime = selfRefreshTime; |
43 | | - sdramTiming.RowCycleDelay = rowCycleDelay; |
44 | | - sdramTiming.WriteRecoveryTime = writeRecoveryTime; |
45 | | - sdramTiming.RPDelay = rpDelay; |
46 | | - sdramTiming.RCDDelay = rcdDelay; |
| 15 | + sdram.Init.ColumnBitsNumber = sdramInitConfig.columnBitsNumber; |
| 16 | + sdram.Init.RowBitsNumber = sdramInitConfig.rowBitsNumber; |
| 17 | + sdram.Init.MemoryDataWidth = sdramInitConfig.memoryDataWidth; |
| 18 | + sdram.Init.InternalBankNumber = sdramInitConfig.internalBankNumber; |
| 19 | + sdram.Init.WriteProtection = sdramInitConfig.writeProtection; |
| 20 | + sdram.Init.ReadBurst = sdramInitConfig.readBurst; |
| 21 | + sdram.Init.ReadPipeDelay = sdramInitConfig.readPipeDelay; |
| 22 | + |
| 23 | + sdramTiming.LoadToActiveDelay = sdramTimingConfig.loadToActiveDelay; |
| 24 | + sdramTiming.ExitSelfRefreshDelay = sdramTimingConfig.exitSelfRefreshDelay; |
| 25 | + sdramTiming.SelfRefreshTime = sdramTimingConfig.selfRefreshTime; |
| 26 | + sdramTiming.RowCycleDelay = sdramTimingConfig.rowCycleDelay; |
| 27 | + sdramTiming.WriteRecoveryTime = sdramTimingConfig.writeRecoveryTime; |
| 28 | + sdramTiming.RPDelay = sdramTimingConfig.rpDelay; |
| 29 | + sdramTiming.RCDDelay = sdramTimingConfig.rcdDelay; |
47 | 30 |
|
48 | 31 | HAL_SDRAM_Init(&sdram, &sdramTiming); |
49 | 32 |
|
50 | | - if (sdBank == FMC_SDRAM_BANK1) |
51 | | - baseAddress = 0xC0000000; |
| 33 | + if (sdramInitConfig.sdBank == FMC_SDRAM_BANK1) //determine read write memory address |
| 34 | + sdramMemoryAddress = 0xC0000000; |
52 | 35 | else |
53 | | - baseAddress = 0xD0000000; |
| 36 | + sdramMemoryAddress = 0xD0000000; |
54 | 37 | } |
55 | 38 |
|
56 | 39 | void FMC::write32(uint32_t offset, uint32_t value) const |
57 | 40 | { |
58 | | - volatile uint32_t* ptr = |
59 | | - reinterpret_cast<volatile uint32_t*>(baseAddress + offset); |
| 41 | + volatile auto* ptr = |
| 42 | + reinterpret_cast<volatile uint32_t*>(sdramMemoryAddress + offset); |
60 | 43 |
|
61 | 44 | *ptr = value; |
62 | 45 | } |
63 | 46 |
|
64 | 47 | uint32_t FMC::read32(uint32_t offset) const |
65 | 48 | { |
66 | | - volatile uint32_t* ptr = |
67 | | - reinterpret_cast<volatile uint32_t*>(baseAddress + offset); |
| 49 | + volatile auto* ptr = |
| 50 | + reinterpret_cast<volatile uint32_t*>(sdramMemoryAddress + offset); |
68 | 51 |
|
69 | 52 | return *ptr; |
70 | 53 | } |
71 | 54 |
|
72 | | -void FMC::InitHardware(const FMCPinConfig& pin_config) { |
| 55 | +void FMC::InitHardware(const FMCPinConfig& pinConfig) { |
73 | 56 | __HAL_RCC_FMC_CLK_ENABLE(); |
74 | 57 |
|
75 | | - InitPinGroup(pin_config.address.pins, pin_config.address.count); |
76 | | - InitPinGroup(pin_config.data.pins, pin_config.data.count); |
77 | | - InitPinGroup(pin_config.byteEnable.pins, pin_config.byteEnable.count); |
78 | | - InitPinGroup(pin_config.bank.pins, pin_config.bank.count); |
79 | | - InitPinGroup(pin_config.command.pins, pin_config.command.count); |
| 58 | + InitPinGroup(pinConfig.address.pins, pinConfig.address.count); |
| 59 | + InitPinGroup(pinConfig.data.pins, pinConfig.data.count); |
| 60 | + InitPinGroup(pinConfig.byteEnable.pins, pinConfig.byteEnable.count); |
| 61 | + InitPinGroup(pinConfig.bank.pins, pinConfig.bank.count); |
| 62 | + InitPinGroup(pinConfig.command.pins, pinConfig.command.count); |
80 | 63 | } |
81 | 64 |
|
82 | 65 | void FMC::InitPinGroup(const FMC_GPIO* pins, uint8_t count) { |
|
0 commit comments