通过宏定义将port与驱动解耦(解决 #2)

- 添加了相应的测试用例,编译通过
This commit is contained in:
2023-11-25 20:19:49 +08:00
parent 64d87e8e9e
commit 69c89346fd
7 changed files with 205 additions and 6 deletions

View File

@@ -0,0 +1,24 @@
# `TARGET` 变量决定了应用程序编译的目标系统。它可以引用源目录中的一个 XN 文件,或者是在编译时作为 `--target` 选项的一个有效参数。
TARGET = PXUA-316-MC-MAX.xn
# 编译选项
# 构建应用程序时传递给 xcc 的参数
# O2: xcc编译器优化等级2
# report: 打开编译报告
# g: 生成调试信息
# fxscope: 使用 xSCOPE对代码进行跟踪默认使用xlink
BUILD_FLAGS = -O2 -g -DDEBUG_PRINT_ENABLE=1 -report -fxscope
USED_MODULES = lib_rgb
XCC_FLAGS = $(BUILD_FLAGS)
XMOS_MODULE_PATH = ../../..
XCOMMON_DISABLE_AUTO_MODULE_SEARCH = 1
#=============================================================================
# 下面部分的 Makefile 包含了用于编译 XMOS 应用程序的公共构建基础设施。你无需编辑此处以下的内容。
XMOS_MAKE_PATH ?= ../..
include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common

View File

@@ -0,0 +1,106 @@
<?xml version="1.0" encoding="UTF-8"?>
<Network xmlns="http://www.xmos.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xmos.com http://www.xmos.com" ManuallySpecifiedRouting="true">
<Type>Board</Type>
<Name>PXUA-316-MC-MAX</Name>
<Declarations>
<Declaration>tileref tile[2]</Declaration>
<Declaration>tileref usb_tile</Declaration>
</Declarations>
<Packages>
<Package id="0" Type="XS3-UnA-1024-FB265">
<Nodes>
<Node Id="0" InPackageId="0" Type="XS3-L16A-1024" Oscillator="24MHz" SystemFrequency="600MHz" referencefrequency="100MHz">
<Boot>
<Source Location="bootFlash"/>
</Boot>
<Tile Number="0" Reference="tile[0]">
<Port Location="XS1_PORT_1B" Name="PORT_SQI_CS"/> <!-- QSPI_CS_N, 0:Flash 1:PSRAM -->
<Port Location="XS1_PORT_1C" Name="PORT_SQI_SCLK"/>
<Port Location="XS1_PORT_4B" Name="PORT_SQI_SIO"/>
<!-- Audio Ports :PXUA-316-MC-MAX -->
<Port Location="XS1_PORT_1A" Name="PORT_MCLK_IN"/> <!-- MCLK(connected to PLL_OUT) -->
<Port Location="XS1_PORT_1L" Name="PORT_I2S_BCLK"/> <!-- I2S_BCLK_IN -->
<Port Location="XS1_PORT_1D" Name="PORT_I2S_LRCLK"/> <!-- I2S_LRCLK_IN -->
<Port Location="XS1_PORT_1M" Name="PORT_I2S_DAC0"/> <!-- I2S_DAC0/TDM_DAC0 -->
<Port Location="XS1_PORT_1N" Name="PORT_I2S_DAC1"/> <!-- I2S_DAC1/TDM_DAC1 -->
<Port Location="XS1_PORT_1O" Name="PORT_I2S_DAC2"/> <!-- I2S_DAC2/TDM_DAC2 -->
<Port Location="XS1_PORT_1P" Name="PORT_I2S_DAC3"/> <!-- I2S_DAC3/TDM_DAC3 or SPDIF_OUT-->
<Port Location="XS1_PORT_1A" Name="PORT_DSD_CLK"/> <!-- DSD CLK -->
<Port Location="XS1_PORT_1D" Name="PORT_DSD_DAC0"/> <!-- DSD_L -->
<port Location="XS1_PORT_1M" Name="PORT_DSD_DAC1"/> <!-- DSD_R -->
<Port Location="XS1_PORT_1P" Name="PORT_SPDIF_OUT"/> <!-- SPDIF_OUT -->
<!-- Ctrl Ports :PXUA-316-MC-MAX -->
<port Location="XS1_PORT_4E" Name="PORT_I2C"/> <!-- 4E2:I2C_CLK, 4E3:I2C_SDA -->
<port Location="XS1_PORT_4F" Name="PORT_MCLK_SELECT"/> <!-- 4F1:CODEC_RST, 4F2:USB_STATE_LED, 4F3:Crystal Selection Mode(1:45.1584MHz 0:49.152MHz) -->
<port Location="XS1_PORT_8D" Name="PORT_BUTTON"/> <!-- The default is 3.3V. Press 0.
8D4:HID_BUTTON0/VOLUME_UP, 8D5:HID_BUTTON1/VOLUME_DOWN.
8D6:HID_BUTTON2/PLAY/PAUSE, 8D7:CUSTOM_BUTTOM/MUTE. -->
<Port Location="XS1_PORT_1C" Name="PORT_PLL_REF"/>
</Tile>
<Tile Number="1" Reference="tile[1]">
<!-- Audio Ports :PXUA-316-MC-MAX -->
<Port Location="XS1_PORT_1D" Name="PORT_MCLK_IN_USB"/> <!-- I2S_MCLK_OUT(PLL Out) -->
<Port Location="XS1_PORT_1G" Name="PORT_EXTRA_I2S_BCLK"/> <!-- EXTRA_I2S_BCLK_OUT -->
<Port Location="XS1_PORT_1C" Name="PORT_EXTRA_I2S_LRCLK"/> <!-- EXTRA_I2S_LRCLK_OUT -->
<Port Location="XS1_PORT_1A" Name="PORT_EXTRA_I2S_ADC0"/> <!-- EXTRA_I2S_ADC0/TDM_ADC0 -->
<Port Location="XS1_PORT_1B" Name="PORT_EXTRA_I2S_ADC1"/> <!-- EXTRA_I2S_ADC1/TDM_ADC1 or SPDIF_IN -->
<Port Location="XS1_PORT_1F" Name="PORT_EXTRA_I2S_ADC2"/> <!-- EXTRA_I2S_ADC2/TDM_ADC2 -->
<Port Location="XS1_PORT_1K" Name="PORT_EXTRA_I2S_ADC3"/> <!-- EXTRA_I2S_ADC3/TDM_ADC3 -->
<Port Location="XS1_PORT_1B" Name="PORT_SPDIF_IN"/> <!-- SPDIF_IN -->
<!-- Ctrl Ports :PXUA-316-MC-MAX -->
<Port Location="XS1_PORT_4A" Name="PORT_RGB_DAISY"/> <!-- 4A3: PORT_RGB_DAISY_CHAIN -->
<Port Location="XS1_PORT_1K" Name="PORT_UART_TX_PP"/> <!-- 1K: UART_TX -->
<Port Location="XS1_PORT_1F" Name="PORT_UART_RX_PP"/> <!-- 1F: UART_RX -->
<!-- Extensions Feature: MIDI_v1.0 -->
<!-- <Port Location="XS1_PORT_1K" Name="PORT_MIDI_OUT"/> -->
<!-- <Port Location="XS1_PORT_1F" Name="PORT_MIDI_IN"/> -->
</Tile>
</Node>
</Nodes>
</Package>
</Packages>
<Nodes>
<Node Id="2" Type="device:" RoutingId="0x8000">
<Service Id="0" Proto="xscope_host_data(chanend c);">
<Chanend Identifier="c" end="3"/>
</Service>
</Node>
</Nodes>
<Links>
<Link Encoding="2wire" Delays="4,4" Flags="XSCOPE">
<LinkEndpoint NodeId="0" Link="XL0"/>
<LinkEndpoint NodeId="2" Chanend="1"/>
</Link>
</Links>
<ExternalDevices>
<Device NodeId="0" Tile="0" Class="SQIFlash" Name="bootFlash" Type="S25FL116K" PageSize="256" SectorSize="4096" NumPages="8192">
<Attribute Name="PORT_SQI_CS" Value="PORT_SQI_CS"/>
<Attribute Name="PORT_SQI_SCLK" Value="PORT_SQI_SCLK"/>
<Attribute Name="PORT_SQI_SIO" Value="PORT_SQI_SIO"/>
<Attribute Name="QE_REGISTER" Value="flash_qe_location_status_reg_1"/>
<Attribute Name="QE_BIT" Value="flash_qe_bit_1"/>
</Device>
</ExternalDevices>
<JTAGChain>
<JTAGDevice NodeId="0"/>
</JTAGChain>
</Network>

View File

@@ -0,0 +1,15 @@
/**
* @file xua_conf.h
* @brief Defines relating to device configuration and customisation.
* For PXUA-XU316-MC-MAX
*/
#ifndef _XUA_CONF_H_
#define _XUA_CONF_H_
/* Defines relating to feature placement regarding tiles */
#ifndef RGB_TILE
#define RGB_TILE (1)
#endif
#include "rgb_driver.h"
#endif

View File

@@ -0,0 +1,26 @@
/** @brief 测试output_rgb_array
*
* @author Vergil Wong
* @date 2023-11-25
* @param
* @return
*/
#include <platform.h> // 包含对封装的定义,引用以使用 on tile[] 语法
extern "C"
{
void test_output_rgb_array_example();
}
int main() // 定义主函数
{
par
{
on tile[1]:
{
test_output_rgb_array_example();
}
}
return 0; // 返回0表示程序正常结束
}

View File

@@ -0,0 +1,16 @@
#include <stdint.h>
#include <stdlib.h>
#include "rgb_effect.h"
void test_output_rgb_array_example()
{
uint32_t buf[NUM_RGBS]; // 定义一个用于存储RGB值的缓冲区大小由NUM_RGBS宏确定
uint32_t num_rgbs = 12;
// Initialize the buffer with example RGB values
for (uint32_t i = 0; i < num_rgbs; ++i) {
buf[i] = (i << 16) | (i << 8) | i; // Just an example pattern for RGB values
}
// Call the function with the test buffer and number of RGBs
output_rgb_array(buf, num_rgbs);
}

View File

@@ -2,6 +2,16 @@
#define RGB_DRIVER_H
#include <stdint.h>
#include <xs1.h>
//TODO: 在XUA工程环境中测试
#ifndef RGB_TILE
#define RGB_TILE (1)
#endif
#ifndef PORT_RGB_DAISY_CHAIN
#define PORT_RGB_DAISY_CHAIN XS1_PORT_4A
#endif
/** 串行输出24位值。
*

View File

@@ -4,6 +4,7 @@
#include <timer.h>
#include "xclib.h"
#include <stdint.h>
#include "rgb_driver.h"
// 如果灯的显示没有出现问题,不要修改这些宏
#define MICROSECONDS 100
@@ -13,8 +14,9 @@
#define T0L_DELAY (93) // 0.9 μs
#define T1L_DELAY (63) // 0.6 μs
// RGB_TILE 通常为0/1PORT_RGB_DAISY_CHAIN为4bit port
on tile[RGB_TILE]: out port p_rgb_4bit = PORT_RGB_DAISY_CHAIN;
on tile[1] : out port p_rgb_rgb = XS1_PORT_4A; // 注意当前代码仅适用于4bit端口
timer tmr;
// 向4A3写时序点亮RT23
@@ -22,19 +24,19 @@ uint32_t output_bit_on_4th_pin(uint32_t bit, uint32_t fall_time)
{
if (bit == 1)
{
p_rgb_rgb<:0xff; // 输出到4位端口
p_rgb_4bit<:0xff; // 输出到4位端口
tmr when timerafter(fall_time + T1H_DELAY):> fall_time; // 等待T1H时长
// printf("[x]fall_time: %u\n", fall_time);
p_rgb_rgb<:0x00; // 将第4位设置为低电平
p_rgb_4bit<:0x00; // 将第4位设置为低电平
tmr when timerafter(fall_time + T1L_DELAY):> fall_time; // 等待T1L时长
// printf("[x]fall_time: %u\n", fall_time);
}
else if (bit == 0)
{
p_rgb_rgb<:0xff; // 输出到4位端口
p_rgb_4bit<:0xff; // 输出到4位端口
tmr when timerafter(fall_time + T0H_DELAY):> fall_time; // 等待T0H时长
// printf("[x]fall_time: %u\n", fall_time);
p_rgb_rgb<:0x00; // 将第4位设置为低电平
p_rgb_4bit<:0x00; // 将第4位设置为低电平
tmr when timerafter(fall_time + T0L_DELAY):> fall_time; // 等待T0L时长
// printf("[x]fall_time: %u\n", fall_time);
}
@@ -52,7 +54,7 @@ void output_24bit_value_serially(uint32_t value)
uint32_t fall_time = 0;
tmr:> fall_time;
// // 重置 RT23由于引脚默认为低此处不做重置
// p_rgb_rgb <: 0x000000;
// p_rgb_4bit <: 0x000000;
// tmr when timerafter(fall_time + RT23_RST_DELAY):> fall_time;
value = value << 8;