Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions src/libxr/generator_code_mspm0.py
Original file line number Diff line number Diff line change
Expand Up @@ -607,13 +607,15 @@ def _uart_section(uarts: list, extend: set[str]) -> list[str]:
tr(
f"{instance}: no DMA TX channel in the SysConfig project (UART > DMA "
"Configuration: Enable DMA TX with the TX trigger, which also gives the "
f"{instance}_INST_DMA_TRIGGER_n and <channel>_CHAN_ID macros); the MSPM0 UART "
f"<channel>_CHAN_ID and {instance}_INST_DMA_TRIGGER macros, the latter "
"numbered _0, _1 when the instance has more than one trigger); the MSPM0 UART "
"driver constructs only with DMA TX. Enable it and run `libxr parse` again, "
"or drop the UART",
f"{instance}:SysConfig 工程里没有 DMA TX 通道(UART > DMA Configuration:"
f"启用 DMA TX 并选 TX 触发,SysConfig 随之生成 {instance}_INST_DMA_TRIGGER_n "
"和 <通道>_CHAN_ID 宏);MSPM0 的 UART 驱动只支持带 DMA TX 的构造。请启用后"
"重新运行 `libxr parse`,或删去这个 UART",
f"启用 DMA TX 并选 TX 触发,SysConfig 随之生成 <通道>_CHAN_ID 和 "
f"{instance}_INST_DMA_TRIGGER 宏,实例有多个触发时带编号 _0、_1);MSPM0 的 "
"UART 驱动只支持带 DMA TX 的构造。请启用后重新运行 `libxr parse`,或删去"
"这个 UART",
)
)
settings = _instance_settings("UART", name, instance in extend)
Expand Down
10 changes: 6 additions & 4 deletions src/libxr/peripheral_analyzer_mspm0.py
Original file line number Diff line number Diff line change
Expand Up @@ -616,16 +616,18 @@ def _gpio_entries(

def _header_dma_channel(name: str, direction: str, defines: dict[str, str]) -> str | None:
"""SysConfig 输出里实例 name 在 direction(TX/RX)方向的 DMA 通道名:每个
<name>_INST_DMA_TRIGGER_n 前面紧挨着它的通道的 <通道>_CHAN_ID。没有时为 None。
<name>_INST_DMA_TRIGGER 或 <name>_INST_DMA_TRIGGER_n 前面紧挨着它的通道的 <通道>_CHAN_ID
(一个实例只有一个触发时 SysConfig 不写编号,两个及以上才写 _0、_1)。没有时为 None。
The DMA channel name of the instance name in direction (TX/RX) in the SysConfig output:
every <name>_INST_DMA_TRIGGER_n directly follows the <channel>_CHAN_ID of its channel. None
when there is none.
every <name>_INST_DMA_TRIGGER or <name>_INST_DMA_TRIGGER_n directly follows the
<channel>_CHAN_ID of its channel (SysConfig writes no number while the instance has one
trigger, and _0, _1 from two on). None when there is none.
"""
channel = None
for macro, value in defines.items():
if macro.endswith("_CHAN_ID"):
channel = macro[: -len("_CHAN_ID")]
elif re.fullmatch(rf"{re.escape(name)}_INST_DMA_TRIGGER_\d+", macro):
elif re.fullmatch(rf"{re.escape(name)}_INST_DMA_TRIGGER(?:_\d+)?", macro):
trigger = DMA_TRIGGER.fullmatch(value)
if trigger and trigger.group(1) == direction and channel:
return channel
Expand Down
57 changes: 57 additions & 0 deletions tests/data/mspm0/uart_tx_dma.syscfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/**
* These arguments were used when this file was generated. They will be automatically applied on subsequent loads
* via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
*/
//@cliArgs --device "MSPM0G350X" --package "LQFP-64(PM)" --part "Default"
//@v2CliArgs --device "MSPM0G3507" --package "LQFP-64(PM)"
// @cliArgs --board /ti/boards/LP_MSPM0G3507 --rtos nortos

/**
* Import the modules used in this configuration.
*/
const UART = scripting.addModule("/ti/driverlib/UART", {}, false);
const UART1 = UART.addInstance();

const GPIO = scripting.addModule("/ti/driverlib/GPIO", {}, false);
const GPIO1 = GPIO.addInstance();

const SYSCTL = scripting.addModule("/ti/driverlib/SYSCTL");

/**
* Write custom configuration values to the imported modules.
*/

UART1.$name = "UART_0";
UART1.profile = "CONFIG_PROFILE_1";
UART1.peripheral.$assign = "UART0";
UART1.targetBaudRate = 9600;
UART1.enableInternalLoopback = false;
UART1.enabledInterrupts = ["DMA_DONE_TX", "EOT_DONE"];
UART1.enableFIFO = true;
UART1.txFifoThreshold = "DL_UART_TX_FIFO_LEVEL_ONE_ENTRY";
UART1.enabledDMATXTriggers = "DL_UART_DMA_INTERRUPT_TX";
UART1.enableDMATX = true;

UART1.peripheral.rxPin.$assign = "PA11";
UART1.peripheral.txPin.$assign = "PA10";

UART1.DMA_CHANNEL_TX.peripheral.$assign = "DMA_CH0";
UART1.DMA_CHANNEL_TX.addressMode = "b2f";
UART1.DMA_CHANNEL_TX.srcIncDec = "INCREMENT";
UART1.DMA_CHANNEL_TX.dstLength = "BYTE";
UART1.DMA_CHANNEL_TX.srcLength = "BYTE";

GPIO1.$name = "GPIO_LEDS";
GPIO1.associatedPins.create(2);
GPIO1.associatedPins[0].$name = "USER_LED_1";
GPIO1.associatedPins[0].assignedPort = "PORTA";
GPIO1.associatedPins[0].initialValue = "SET";
GPIO1.associatedPins[0].assignedPin = "0";
GPIO1.associatedPins[0].pin.$assign = "PA0";
GPIO1.associatedPins[1].$name = "USER_TEST";
GPIO1.associatedPins[1].assignedPort = "PORTA";
GPIO1.associatedPins[1].assignedPin = "15";
GPIO1.associatedPins[1].initialValue = "SET";

SYSCTL.clockTreeEn = true;
SYSCTL.forceDefaultClkConfig = true;
171 changes: 171 additions & 0 deletions tests/data/mspm0/uart_tx_dma_ti_msp_dl_config.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
/*
* Copyright (c) 2023, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*
* ============ ti_msp_dl_config.c =============
* Configured MSPM0 DriverLib module definitions
*
* DO NOT EDIT - This file is generated for the LP_MSPM0G3507
* by the SysConfig tool.
*/

#include "ti_msp_dl_config.h"

/*
* ======== SYSCFG_DL_init ========
* Perform any initialization needed before using any board APIs
*/
SYSCONFIG_WEAK void SYSCFG_DL_init(void)
{
SYSCFG_DL_initPower();
SYSCFG_DL_GPIO_init();
/* Module-Specific Initializations*/
SYSCFG_DL_SYSCTL_init();
SYSCFG_DL_UART_0_init();
SYSCFG_DL_DMA_init();
}



SYSCONFIG_WEAK void SYSCFG_DL_initPower(void)
{
DL_GPIO_reset(GPIOA);
DL_GPIO_reset(GPIOB);
DL_UART_Main_reset(UART_0_INST);


DL_GPIO_enablePower(GPIOA);
DL_GPIO_enablePower(GPIOB);
DL_UART_Main_enablePower(UART_0_INST);

delay_cycles(POWER_STARTUP_DELAY);
}

SYSCONFIG_WEAK void SYSCFG_DL_GPIO_init(void)
{

DL_GPIO_initPeripheralOutputFunction(
GPIO_UART_0_IOMUX_TX, GPIO_UART_0_IOMUX_TX_FUNC);
DL_GPIO_initPeripheralInputFunction(
GPIO_UART_0_IOMUX_RX, GPIO_UART_0_IOMUX_RX_FUNC);

DL_GPIO_initDigitalOutput(GPIO_LEDS_USER_LED_1_IOMUX);

DL_GPIO_initDigitalOutput(GPIO_LEDS_USER_TEST_IOMUX);

DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN |
GPIO_LEDS_USER_TEST_PIN);
DL_GPIO_enableOutput(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN |
GPIO_LEDS_USER_TEST_PIN);

}



SYSCONFIG_WEAK void SYSCFG_DL_SYSCTL_init(void)
{

//Low Power Mode is configured to be SLEEP0
DL_SYSCTL_setBORThreshold(DL_SYSCTL_BOR_THRESHOLD_LEVEL_0);


DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_BASE);
/* Set default configuration */
DL_SYSCTL_disableHFXT();
DL_SYSCTL_disableSYSPLL();

}


static const DL_UART_Main_ClockConfig gUART_0ClockConfig = {
.clockSel = DL_UART_MAIN_CLOCK_BUSCLK,
.divideRatio = DL_UART_MAIN_CLOCK_DIVIDE_RATIO_1
};

static const DL_UART_Main_Config gUART_0Config = {
.mode = DL_UART_MAIN_MODE_NORMAL,
.direction = DL_UART_MAIN_DIRECTION_TX_RX,
.flowControl = DL_UART_MAIN_FLOW_CONTROL_NONE,
.parity = DL_UART_MAIN_PARITY_NONE,
.wordLength = DL_UART_MAIN_WORD_LENGTH_8_BITS,
.stopBits = DL_UART_MAIN_STOP_BITS_ONE
};

SYSCONFIG_WEAK void SYSCFG_DL_UART_0_init(void)
{
DL_UART_Main_setClockConfig(UART_0_INST, (DL_UART_Main_ClockConfig *) &gUART_0ClockConfig);

DL_UART_Main_init(UART_0_INST, (DL_UART_Main_Config *) &gUART_0Config);
/*
* Configure baud rate by setting oversampling and baud rate divisors.
* Target baud rate: 9600
* Actual baud rate: 9600.24
*/
DL_UART_Main_setOversampling(UART_0_INST, DL_UART_OVERSAMPLING_RATE_16X);
DL_UART_Main_setBaudRateDivisor(UART_0_INST, UART_0_IBRD_32_MHZ_9600_BAUD, UART_0_FBRD_32_MHZ_9600_BAUD);


/* Configure Interrupts */
DL_UART_Main_enableInterrupt(UART_0_INST,
DL_UART_MAIN_INTERRUPT_DMA_DONE_TX |
DL_UART_MAIN_INTERRUPT_EOT_DONE);

/* Configure DMA Transmit Event */
DL_UART_Main_enableDMATransmitEvent(UART_0_INST);
/* Configure FIFOs */
DL_UART_Main_enableFIFOs(UART_0_INST);
DL_UART_Main_setRXFIFOThreshold(UART_0_INST, DL_UART_RX_FIFO_LEVEL_ONE_ENTRY);
DL_UART_Main_setTXFIFOThreshold(UART_0_INST, DL_UART_TX_FIFO_LEVEL_ONE_ENTRY);

DL_UART_Main_enable(UART_0_INST);
}

static const DL_DMA_Config gDMA_CH0Config = {
.transferMode = DL_DMA_SINGLE_TRANSFER_MODE,
.extendedMode = DL_DMA_NORMAL_MODE,
.destIncrement = DL_DMA_ADDR_UNCHANGED,
.srcIncrement = DL_DMA_ADDR_INCREMENT,
.destWidth = DL_DMA_WIDTH_BYTE,
.srcWidth = DL_DMA_WIDTH_BYTE,
.trigger = UART_0_INST_DMA_TRIGGER,
.triggerType = DL_DMA_TRIGGER_TYPE_EXTERNAL,
};

SYSCONFIG_WEAK void SYSCFG_DL_DMA_CH0_init(void)
{
DL_DMA_initChannel(DMA, DMA_CH0_CHAN_ID , (DL_DMA_Config *) &gDMA_CH0Config);
}
SYSCONFIG_WEAK void SYSCFG_DL_DMA_init(void){
SYSCFG_DL_DMA_CH0_init();
}


Loading
Loading