aboutsummaryrefslogtreecommitdiff
path: root/src/sample/io_sample/IR/Rx+GDMA/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sample/io_sample/IR/Rx+GDMA/main.c')
-rw-r--r--src/sample/io_sample/IR/Rx+GDMA/main.c233
1 files changed, 233 insertions, 0 deletions
diff --git a/src/sample/io_sample/IR/Rx+GDMA/main.c b/src/sample/io_sample/IR/Rx+GDMA/main.c
new file mode 100644
index 0000000..e6dc229
--- /dev/null
+++ b/src/sample/io_sample/IR/Rx+GDMA/main.c
@@ -0,0 +1,233 @@
+/* Includes ------------------------------------------------------------------*/
+#include <string.h>
+#include <stdlib.h>
+#include "rtl876x_gdma.h"
+#include "rtl876x_ir.h"
+#include "rtl876x_nvic.h"
+#include "rtl876x_pinmux.h"
+#include "rtl876x_rcc.h"
+#include "rtl876x_tim.h"
+#include "trace.h"
+
+
+
+#define IR_RX_PIN P2_5
+#define IR_RX_FIFO_THR_LEVEL 30
+#define IR_DATA_SIZE_MAX 80
+#define IO_TEST_GDMA_TRANSFER_SIZE IR_DATA_SIZE_MAX
+
+#define PWM_OUT_PIN P2_6//Used for IR sampling output, for debug
+#define PWM_OUT_PINMUX TIM_PWM5
+#define PWM_TIMER_NUM TIM5
+#define PWM_HIGH_COUNT (20000 - 1)
+#define PWM_LOW_COUNT (20000 - 1)
+
+#define IO_TEST_GDMA_CHANNEL_MUM 1
+
+#if (IO_TEST_GDMA_CHANNEL_MUM == 0)
+#define IO_TEST_GDMA_Channel GDMA_Channel0
+#define IO_TEST_GDMA_Channel_IRQn GDMA0_Channel0_IRQn
+#define IO_TEST_GDMA_Channel_Handler GDMA0_Channel0_Handler
+#elif IO_TEST_GDMA_CHANNEL_MUM == 1
+#define IO_TEST_GDMA_Channel GDMA_Channel1
+#define IO_TEST_GDMA_Channel_IRQn GDMA0_Channel1_IRQn
+#define IO_TEST_GDMA_Channel_Handler GDMA0_Channel1_Handler
+#elif IO_TEST_GDMA_CHANNEL_MUM == 2
+#define IO_TEST_GDMA_Channel GDMA_Channel2
+#define IO_TEST_GDMA_Channel_IRQn GDMA0_Channel2_IRQn
+#define IO_TEST_GDMA_Channel_Handler GDMA0_Channel2_Handler
+#elif IO_TEST_GDMA_CHANNEL_MUM == 3
+#define IO_TEST_GDMA_Channel GDMA_Channel3
+#define IO_TEST_GDMA_Channel_IRQn GDMA0_Channel3_IRQn
+#define IO_TEST_GDMA_Channel_Handler GDMA0_Channel3_Handler
+#elif IO_TEST_GDMA_CHANNEL_MUM == 4
+#endif
+
+/* Globals ------------------------------------------------------------------*/
+uint32_t GDMA_Recv_Buf[4095];
+uint16_t IR_GDMA_Rev_Data_Len = 0;
+
+/**
+ * @brief Initialization of pinmux settings and pad settings.
+ * @param No parameter.
+ * @return void
+*/
+void board_pwm_init(void)
+{
+ Pad_Config(PWM_OUT_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE,
+ PAD_OUT_HIGH);
+ /* Normal mode */
+ Pinmux_Config(PWM_OUT_PIN, PWM_OUT_PINMUX);
+}
+
+/**
+ * @brief Initialize tim peripheral.
+ * @param No parameter.
+ * @return void
+*/
+void driver_pwm_init(void)
+{
+ RCC_PeriphClockCmd(APBPeriph_TIMER, APBPeriph_TIMER_CLOCK, ENABLE);
+
+ TIM_TimeBaseInitTypeDef TIM_InitStruct;
+ TIM_StructInit(&TIM_InitStruct);
+
+ TIM_InitStruct.TIM_PWM_En = PWM_ENABLE;
+ TIM_InitStruct.TIM_PWM_High_Count = PWM_HIGH_COUNT;
+ TIM_InitStruct.TIM_PWM_Low_Count = PWM_LOW_COUNT;
+ TIM_InitStruct.TIM_Mode = TIM_Mode_UserDefine;
+ TIM_TimeBaseInit(PWM_TIMER_NUM, &TIM_InitStruct);
+}
+
+/**
+ * @brief Initialization of pinmux settings and pad settings.
+ * @param No parameter.
+ * @return void
+ */
+void board_ir_init(void)
+{
+ Pad_Config(IR_RX_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_LOW);
+ Pad_PullConfigValue(IR_RX_PIN, PAD_STRONG_PULL);
+
+ Pinmux_Config(IR_RX_PIN, IRDA_RX);
+}
+
+/**
+ * @brief Initialize ir peripheral.
+ * @param No parameter.
+ * @return void
+ */
+void driver_ir_init(void)
+{
+ /* Enable IR clock */
+ RCC_PeriphClockCmd(APBPeriph_IR, APBPeriph_IR_CLOCK, ENABLE);
+// RCC_IRClockConfig(ENABLE);
+
+ /* Initialize IR */
+ IR_InitTypeDef IR_InitStruct;
+ IR_StructInit(&IR_InitStruct);
+
+ IR_InitStruct.IR_Clock = IR_CLOCK_40M;
+ IR_InitStruct.IR_Freq = 40000000;
+ IR_InitStruct.IR_Mode = IR_MODE_RX;
+ IR_InitStruct.IR_RxStartMode = IR_RX_AUTO_MODE;
+ IR_InitStruct.IR_RxFIFOThrLevel = IR_RX_FIFO_THR_LEVEL;
+ IR_InitStruct.IR_RxFIFOFullCtrl = IR_RX_FIFO_FULL_DISCARD_NEWEST;
+ IR_InitStruct.IR_RxFilterTime = IR_RX_FILTER_TIME_50ns;
+ IR_InitStruct.IR_RxTriggerMode = IR_RX_FALL_EDGE;
+ IR_InitStruct.IR_RxCntThrType = IR_RX_Count_High_Level;
+ IR_InitStruct.IR_RxCntThr = 0x0ED8;
+ IR_InitStruct.IR_RxDmaEn = ENABLE;
+ IR_InitStruct.IR_RxWaterLevel = 4;
+
+ IR_Init(&IR_InitStruct);
+ IR_Cmd(IR_MODE_RX, ENABLE);
+ IR_ClearRxFIFO();
+}
+
+/**
+ * @brief Initialize GDMA peripheral.
+ * @param No parameter.
+ * @return void
+ */
+void driver_ir_gdma_init(void)
+{
+ RCC_PeriphClockCmd(APBPeriph_GDMA, APBPeriph_GDMA_CLOCK, ENABLE);
+ GDMA_InitTypeDef GDMA_InitStruct;
+
+ memset(GDMA_Recv_Buf, 0, sizeof(GDMA_Recv_Buf));
+
+ /*--------------GDMA init-----------------------------*/
+ GDMA_StructInit(&GDMA_InitStruct);
+ GDMA_InitStruct.GDMA_ChannelNum = IO_TEST_GDMA_CHANNEL_MUM;
+ GDMA_InitStruct.GDMA_BufferSize = IO_TEST_GDMA_TRANSFER_SIZE;//determine total transfer size
+ GDMA_InitStruct.GDMA_DIR = GDMA_DIR_PeripheralToMemory;//GDMA_DIR_PeripheralToMemory
+ GDMA_InitStruct.GDMA_SourceDataSize = GDMA_DataSize_Word;
+ GDMA_InitStruct.GDMA_DestinationDataSize = GDMA_DataSize_Word;
+ GDMA_InitStruct.GDMA_SourceMsize = GDMA_Msize_4;
+ GDMA_InitStruct.GDMA_DestinationMsize = GDMA_Msize_4;
+ GDMA_InitStruct.GDMA_SourceInc = DMA_SourceInc_Fix;
+ GDMA_InitStruct.GDMA_DestinationInc = DMA_DestinationInc_Inc;
+ GDMA_InitStruct.GDMA_SourceAddr = (uint32_t)(&IR->RX_FIFO);
+ GDMA_InitStruct.GDMA_DestinationAddr = (uint32_t)(GDMA_Recv_Buf);
+ GDMA_InitStruct.GDMA_SourceHandshake = GDMA_Handshake_IR_RX;
+ GDMA_Init(IO_TEST_GDMA_Channel, &GDMA_InitStruct);
+
+ GDMA_INTConfig(IO_TEST_GDMA_CHANNEL_MUM, GDMA_INT_Transfer, ENABLE);
+
+ /*-----------------GDMA IRQ init-------------------*/
+ NVIC_InitTypeDef nvic_init_struct;
+ nvic_init_struct.NVIC_IRQChannel = IO_TEST_GDMA_Channel_IRQn;
+ nvic_init_struct.NVIC_IRQChannelCmd = (FunctionalState)ENABLE;
+ nvic_init_struct.NVIC_IRQChannelPriority = 3;
+ NVIC_Init(&nvic_init_struct);
+
+ GDMA_Cmd(IO_TEST_GDMA_CHANNEL_MUM, ENABLE);
+}
+
+/**
+ * @brief Handle gdma data function.
+ * @param No parameter.
+ * @return void
+ */
+void io_handle_gdma_msg(void)
+{
+ DBG_DIRECT("io_handle_gdma_msg: IR_GDMA_Rev_Data_Len = %d \r\n", IR_GDMA_Rev_Data_Len);
+ for (uint32_t i = 0; i < IR_GDMA_Rev_Data_Len; i++)
+ {
+ DBG_DIRECT("io_handle_gdma_msg: GDMA_Recv_Buf[%d] = 0x%x \r\n", i, GDMA_Recv_Buf[i]);
+ }
+}
+
+/**
+ * @brief Demo code of ir send data.
+ * @param No parameter.
+ * @return Void
+*/
+void ir_demo(void)
+{
+ board_pwm_init();
+ driver_pwm_init();
+ TIM_Cmd(PWM_TIMER_NUM, ENABLE);
+ board_ir_init();
+ driver_ir_init();
+ driver_ir_gdma_init();
+}
+
+/**
+ * @brief Entry of APP code
+ * @return int (To avoid compile warning)
+*/
+int main(void)
+{
+ extern uint32_t random_seed_value;
+ srand(random_seed_value);
+ __enable_irq();
+
+ ir_demo();
+
+ while (1)
+ {
+ __nop();
+ __nop();
+ __nop();
+ __nop();
+ __nop();
+ __nop();
+
+ }
+}
+
+/**
+ * @brief GDMA channel interrupt handler function.
+ * @param No parameter.
+ * @return void
+ */
+void IO_TEST_GDMA_Channel_Handler(void)
+{
+ GDMA_INTConfig(IO_TEST_GDMA_CHANNEL_MUM, GDMA_INT_Transfer, DISABLE);
+ GDMA_Cmd(IO_TEST_GDMA_CHANNEL_MUM, DISABLE);
+ IR_GDMA_Rev_Data_Len = IO_TEST_GDMA_TRANSFER_SIZE;
+ io_handle_gdma_msg();
+ GDMA_ClearINTPendingBit(IO_TEST_GDMA_CHANNEL_MUM, GDMA_INT_Transfer);
+}