841 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			841 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/****************************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics Ltd. ALL RIGHTS RESERVED.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics Ltd and MAY NOT
							 | 
						||
| 
								 | 
							
								be copied by any method or incorporated into another program without
							 | 
						||
| 
								 | 
							
								the express written consent of Aerospace C.Power. This Information or any portion
							 | 
						||
| 
								 | 
							
								thereof remains the property of Aerospace C.Power. The Information contained herein
							 | 
						||
| 
								 | 
							
								is believed to be accurate and Aerospace C.Power assumes no responsibility or
							 | 
						||
| 
								 | 
							
								liability for its use in any way and conveys no license or title under
							 | 
						||
| 
								 | 
							
								any patent or copyright and makes no representation or warranty that this
							 | 
						||
| 
								 | 
							
								Information is free from patent or copyright infringement.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								****************************************************************************/
							 | 
						||
| 
								 | 
							
								/* os shim includes */
							 | 
						||
| 
								 | 
							
								#include "os_types.h"
							 | 
						||
| 
								 | 
							
								#include "os_task.h"
							 | 
						||
| 
								 | 
							
								#include "os_utils.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* common includes */
							 | 
						||
| 
								 | 
							
								#include "iot_io.h"
							 | 
						||
| 
								 | 
							
								#include "iot_bitops.h"
							 | 
						||
| 
								 | 
							
								#include "iot_pkt.h"
							 | 
						||
| 
								 | 
							
								#include "iot_ipc.h"
							 | 
						||
| 
								 | 
							
								#include "iot_plc_lib.h"
							 | 
						||
| 
								 | 
							
								#include "iot_dbglog_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_config.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* driver includes */
							 | 
						||
| 
								 | 
							
								#include "iot_clock.h"
							 | 
						||
| 
								 | 
							
								#include "iot_uart.h"
							 | 
						||
| 
								 | 
							
								#include "iot_led.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* cli includes */
							 | 
						||
| 
								 | 
							
								#include "iot_cli.h"
							 | 
						||
| 
								 | 
							
								#include "iot_uart_h.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* debug includes*/
							 | 
						||
| 
								 | 
							
								#include "dbg_io.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "apb_dma.h"
							 | 
						||
| 
								 | 
							
								#include "dma_sw.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "iot_gpio_api.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "apb_glb_reg.h"
							 | 
						||
| 
								 | 
							
								#include "hw_reg_api.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "gpio_mtx_reg.h"
							 | 
						||
| 
								 | 
							
								#include "pin_rf.h"
							 | 
						||
| 
								 | 
							
								#include "apb.h"
							 | 
						||
| 
								 | 
							
								#include "ahb_hw.h"
							 | 
						||
| 
								 | 
							
								#include "gpio_mtx.h"
							 | 
						||
| 
								 | 
							
								#include "iot_share_task.h"
							 | 
						||
| 
								 | 
							
								#include "gp_timer.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "iot_pkt.h"
							 | 
						||
| 
								 | 
							
								#include "dwc_eth.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "iot_img_hdr.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define K3D_RUN_MODE 3  // 1: binary mode 2: raw mode
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern void ddr_module_cache_cfg();
							 | 
						||
| 
								 | 
							
								extern void camera_module_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern void ai_depth_auto_mode_cfg();
							 | 
						||
| 
								 | 
							
								extern void ai_ref_pic_capture();
							 | 
						||
| 
								 | 
							
								extern void ai_poll_done();
							 | 
						||
| 
								 | 
							
								extern void ai_ram_auto_mode_cfg();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static const iot_pkt_config_t test_pkt_config =
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            256,
							 | 
						||
| 
								 | 
							
								            50,
							 | 
						||
| 
								 | 
							
								            PKT_OWNER_ALL,
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            600,
							 | 
						||
| 
								 | 
							
								            50,
							 | 
						||
| 
								 | 
							
								            PKT_OWNER_ALL,
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            1100,
							 | 
						||
| 
								 | 
							
								            15,
							 | 
						||
| 
								 | 
							
								            PKT_OWNER_ALL,
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            2200,
							 | 
						||
| 
								 | 
							
								            6,
							 | 
						||
| 
								 | 
							
								            PKT_OWNER_ALL,
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            0,
							 | 
						||
| 
								 | 
							
								            0,
							 | 
						||
| 
								 | 
							
								            PKT_OWNER_NONE,
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            0,
							 | 
						||
| 
								 | 
							
								            0,
							 | 
						||
| 
								 | 
							
								            PKT_OWNER_NONE,
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            0,
							 | 
						||
| 
								 | 
							
								            0,
							 | 
						||
| 
								 | 
							
								            PKT_OWNER_NONE,
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            0,
							 | 
						||
| 
								 | 
							
								            0,
							 | 
						||
| 
								 | 
							
								            PKT_OWNER_NONE,
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* dma config */
							 | 
						||
| 
								 | 
							
								#define DMA_ETH_CHKSUM  DMA_DEV_SW0
							 | 
						||
| 
								 | 
							
								typedef struct _chksum_dma {
							 | 
						||
| 
								 | 
							
								    uint8_t *src;
							 | 
						||
| 
								 | 
							
								    uint16_t len;
							 | 
						||
| 
								 | 
							
								} chksum_dma_t;
							 | 
						||
| 
								 | 
							
								desc_sw_t out_descls[4];
							 | 
						||
| 
								 | 
							
								desc_sw_t in_descls[4];
							 | 
						||
| 
								 | 
							
								chksum_dma_t g_chksum_buf_t[4] = {0};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								volatile uint8_t g_chksum_flag = 0;
							 | 
						||
| 
								 | 
							
								void IRAM_ATTR dma_handler(int vector, int status)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)vector;
							 | 
						||
| 
								 | 
							
								    if (status & DMA_OUT_TOTAL_EOF_INT_ST_MASK)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        //dma_pop_all_desc_list(DTEST_DMA_DEV, &desc1, &desc2);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (status & 8) {
							 | 
						||
| 
								 | 
							
								        g_chksum_flag = 1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void eth_chksum_get(chksum_dma_t *chksum_dma, uint8_t num,
							 | 
						||
| 
								 | 
							
								        void *dest, uint16_t total_len, uint16_t *chksum)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    chksum_dma_t *data = NULL;
							 | 
						||
| 
								 | 
							
								    uint8_t *d = (uint8_t *) dest;
							 | 
						||
| 
								 | 
							
								    uint8_t i = 0;
							 | 
						||
| 
								 | 
							
								    if (num > 4) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (total_len > 2000) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    for (i = 0; i < num; i++) {
							 | 
						||
| 
								 | 
							
								        data = chksum_dma+i;
							 | 
						||
| 
								 | 
							
								#if 0
							 | 
						||
| 
								 | 
							
								        DMA_MAKE_DESC(&out_descls[i], data->src, data->len, data->len,
							 | 
						||
| 
								 | 
							
								                        0, 0, 0, DESC_OWNER_DMA);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								        DMA_MAKE_SW_DESC(&out_descls[i], data->src, 0, data->len,
							 | 
						||
| 
								 | 
							
								                        1, 0, 0, DESC_OWNER_DMA, 0);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								        //make out desc list
							 | 
						||
| 
								 | 
							
								        out_descls[i].n_ptr = NULL;
							 | 
						||
| 
								 | 
							
								        if (i)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            out_descls[i].l_ptr = &out_descls[i-1];
							 | 
						||
| 
								 | 
							
								            out_descls[i - 1].n_ptr = &out_descls[i];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            out_descls[i].l_ptr = NULL;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#if 0
							 | 
						||
| 
								 | 
							
								    DMA_MAKE_DESC(&in_descls[0], d, total_len, total_len,
							 | 
						||
| 
								 | 
							
								                    0, 0, 0, DESC_OWNER_DMA);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    DMA_MAKE_SW_DESC(&in_descls[0], d, 0, total_len,
							 | 
						||
| 
								 | 
							
								                    1, 0, 0, DESC_OWNER_DMA, 0);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    g_chksum_flag = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dma_sw_start(DMA_ETH_CHKSUM, in_descls, out_descls);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    while(1) {
							 | 
						||
| 
								 | 
							
								        if (g_chksum_flag) {
							 | 
						||
| 
								 | 
							
								            *chksum = dma_sw_verify_value_get(DMA_ETH_CHKSUM);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								t_dwc_ctrl *g_emac_ctrl = NULL;
							 | 
						||
| 
								 | 
							
								#define EMAC_TEST_UNIT  0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								char dst_ip[] = {192, 168, 4, 163};
							 | 
						||
| 
								 | 
							
								char src_ip[] = {192, 168, 4, 28};
							 | 
						||
| 
								 | 
							
								os_task_h test_init_handle;
							 | 
						||
| 
								 | 
							
								os_task_h test_send_handle;
							 | 
						||
| 
								 | 
							
								extern int platform_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void signal_dump(int sig)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int data;
							 | 
						||
| 
								 | 
							
								    if(sig < 57)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        data = *(volatile int*)(0x44020000 + 0x4*sig);
							 | 
						||
| 
								 | 
							
								        iot_printf("\r\nSIGN#%02d(CORE#%02d, DEFT#%02d) <- GPIO#%03d.",
							 | 
						||
| 
								 | 
							
								            sig, (data&0x1000)?1:0, (data&0x300)>>8, data&0xFF);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        iot_printf("\r\nSIGN#%02d INVALID!");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void gpio_dump(int g)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int data, data2, addr;
							 | 
						||
| 
								 | 
							
								    if(g < 47)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(g < 29){
							 | 
						||
| 
								 | 
							
								            addr = 0x44007000 + 0x24 + (g << 2);
							 | 
						||
| 
								 | 
							
								        } else if(g  < 37 ){
							 | 
						||
| 
								 | 
							
								            addr = 0x44007000 + 0x4 + ((g-29)<<2);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if(g < 43){
							 | 
						||
| 
								 | 
							
								            addr = 0x44007000 + 0xa8 + ((g-37)<<2);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if( g < 47){
							 | 
						||
| 
								 | 
							
								            addr =0x44007000 + 0x98 + ((g-43)<< 2);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        data = *(volatile int*)addr;
							 | 
						||
| 
								 | 
							
								        data2 = *(volatile int*)(0x44020400 + 0x4*g);
							 | 
						||
| 
								 | 
							
								        iot_printf("\r\nGPIO#%02d(FUNC#%02d, PULL#%c%c) <- SIGN#%03d.",
							 | 
						||
| 
								 | 
							
								            g, (data&0x30)>>4, (data&0x80)?'U':'-', (data&0x40)?'D':'-', data2&0xFF);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        iot_printf("\r\nGPIO#%02d INVALID!");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void eth_gpio_dump(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int g;
							 | 
						||
| 
								 | 
							
								    for(g = 8; g < 15; g++)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        gpio_dump(g);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    gpio_dump(18);
							 | 
						||
| 
								 | 
							
								    gpio_dump(19);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    signal_dump(43);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define IMG_LENGTH 1024
							 | 
						||
| 
								 | 
							
								#define IMG_WIDTH 720
							 | 
						||
| 
								 | 
							
								#define IMG_BIT 16
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define UDP_PROTOCOL 17
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern void dwc_gpio_bind(int unit);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern uint8_t g_print_enable;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define SWAP_L2B_SHORT(v) ((((v)&0xff) << 8) | (((v)&0xff00) >> 8))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma pack(push)
							 | 
						||
| 
								 | 
							
								#pragma pack(1)
							 | 
						||
| 
								 | 
							
								typedef struct _eth_header {
							 | 
						||
| 
								 | 
							
								    uint8_t dst_mac[6];
							 | 
						||
| 
								 | 
							
								    uint8_t src_mac[6];
							 | 
						||
| 
								 | 
							
								    uint16_t eth_type;
							 | 
						||
| 
								 | 
							
								} eth_header_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _ip_header {
							 | 
						||
| 
								 | 
							
								    uint8_t hdr_len:4;
							 | 
						||
| 
								 | 
							
								    uint8_t version:4;
							 | 
						||
| 
								 | 
							
								    uint8_t tos;        // type of service
							 | 
						||
| 
								 | 
							
								    uint16_t tot_len;   // total length
							 | 
						||
| 
								 | 
							
								    uint16_t id;        // identification
							 | 
						||
| 
								 | 
							
								    uint16_t frag_off;  //
							 | 
						||
| 
								 | 
							
								    uint8_t ttl;        // time to live
							 | 
						||
| 
								 | 
							
								    uint8_t protocol;   // protocol : 17:UDP
							 | 
						||
| 
								 | 
							
								    uint16_t chk_sum;   // check sum
							 | 
						||
| 
								 | 
							
								    uint8_t srcaddr[4]; // src ip address
							 | 
						||
| 
								 | 
							
								    uint8_t dstaddr[4]; // dest ip address
							 | 
						||
| 
								 | 
							
								} ip_header_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _udp_header {
							 | 
						||
| 
								 | 
							
								    uint16_t src_port;
							 | 
						||
| 
								 | 
							
								    uint16_t dst_port;
							 | 
						||
| 
								 | 
							
								    uint16_t udp_len;
							 | 
						||
| 
								 | 
							
								    uint16_t chk_sum;
							 | 
						||
| 
								 | 
							
								} udp_header_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _eth_udp_header {
							 | 
						||
| 
								 | 
							
								    eth_header_t eth_hdr;
							 | 
						||
| 
								 | 
							
								    ip_header_t ip_hdr;
							 | 
						||
| 
								 | 
							
								    udp_header_t udp_hdr;
							 | 
						||
| 
								 | 
							
								} eth_udp_header_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _img_header {
							 | 
						||
| 
								 | 
							
								    uint32_t frame_id;
							 | 
						||
| 
								 | 
							
								    uint32_t pkt_id;
							 | 
						||
| 
								 | 
							
								    uint32_t pkt_size;
							 | 
						||
| 
								 | 
							
								} img_header_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _pseudo_header {
							 | 
						||
| 
								 | 
							
								    uint16_t len;
							 | 
						||
| 
								 | 
							
								    uint8_t mbz;
							 | 
						||
| 
								 | 
							
								    uint8_t protocol;
							 | 
						||
| 
								 | 
							
								    uint8_t dst[4];
							 | 
						||
| 
								 | 
							
								    uint8_t src[4];
							 | 
						||
| 
								 | 
							
								} pseudo_header_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma pack(pop)
							 | 
						||
| 
								 | 
							
								// global value set
							 | 
						||
| 
								 | 
							
								uint8_t dst_mac[6] = {0x00, 0x21, 0x85, 0xc5, 0x2b, 0x8f};
							 | 
						||
| 
								 | 
							
								uint16_t g_eth_type = SWAP_L2B_SHORT(0x0800);
							 | 
						||
| 
								 | 
							
								uint16_t g_udp_src_port = SWAP_L2B_SHORT(1313);
							 | 
						||
| 
								 | 
							
								uint16_t g_udp_dst_port = SWAP_L2B_SHORT(46832);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint16_t chksum(void *data, uint16_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  //return 0;
							 | 
						||
| 
								 | 
							
								  uint32_t acc;
							 | 
						||
| 
								 | 
							
								  uint16_t src;
							 | 
						||
| 
								 | 
							
								  uint8_t *octetptr;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  acc = 0;
							 | 
						||
| 
								 | 
							
								  octetptr = (uint8_t*)data;
							 | 
						||
| 
								 | 
							
								  while (len > 1) {
							 | 
						||
| 
								 | 
							
								    src = (*octetptr) << 8;
							 | 
						||
| 
								 | 
							
								    octetptr++;
							 | 
						||
| 
								 | 
							
								    src |= (*octetptr);
							 | 
						||
| 
								 | 
							
								    octetptr++;
							 | 
						||
| 
								 | 
							
								    acc += src;
							 | 
						||
| 
								 | 
							
								    len -= 2;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (len > 0) {
							 | 
						||
| 
								 | 
							
								    src = (*octetptr) << 8;
							 | 
						||
| 
								 | 
							
								    acc += src;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  acc = (acc >> 16) + (acc & 0x0000ffffUL);
							 | 
						||
| 
								 | 
							
								  if ((acc & 0xffff0000UL) != 0) {
							 | 
						||
| 
								 | 
							
								    acc = (acc >> 16) + (acc & 0x0000ffffUL);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  src = (uint16_t)acc;
							 | 
						||
| 
								 | 
							
								  return ~src;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void eth_test_send_udp(uint8_t *piece, uint32_t size,
							 | 
						||
| 
								 | 
							
								            uint32_t frame_id, uint16_t pkt_id)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    iot_pkt_ls lst;
							 | 
						||
| 
								 | 
							
								    uint32_t udp_frame_size = size
							 | 
						||
| 
								 | 
							
								        + sizeof(img_header_t) + sizeof(eth_udp_header_t);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (udp_frame_size > 1500) {
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								again:
							 | 
						||
| 
								 | 
							
								    lst.pkt = iot_pkt_alloc(udp_frame_size, 0);
							 | 
						||
| 
								 | 
							
								    if (lst.pkt == NULL) {
							 | 
						||
| 
								 | 
							
								        //g_print_enable = 1;
							 | 
						||
| 
								 | 
							
								        //IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								        //iot_printf("alloc failed\n");
							 | 
						||
| 
								 | 
							
								        //g_print_enable = 0;
							 | 
						||
| 
								 | 
							
								        goto again;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    lst.next = NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_pkt_set_data(lst.pkt, lst.pkt->head);
							 | 
						||
| 
								 | 
							
								    iot_pkt_set_tail(lst.pkt, lst.pkt->data + udp_frame_size + 4);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // udp header and payload
							 | 
						||
| 
								 | 
							
								    uint32_t udp_len = udp_frame_size - sizeof(eth_header_t)
							 | 
						||
| 
								 | 
							
								        - sizeof(ip_header_t);
							 | 
						||
| 
								 | 
							
								#if 0   /* udp packet and sw checksum */
							 | 
						||
| 
								 | 
							
								    udp_header_t *udp_hdr = (udp_header_t *)(lst.pkt->data
							 | 
						||
| 
								 | 
							
								        + sizeof(eth_header_t) + sizeof(ip_header_t));
							 | 
						||
| 
								 | 
							
								    // fill udp header data
							 | 
						||
| 
								 | 
							
								    udp_hdr->src_port = g_udp_src_port;
							 | 
						||
| 
								 | 
							
								    udp_hdr->dst_port = g_udp_dst_port;
							 | 
						||
| 
								 | 
							
								    udp_hdr->udp_len = SWAP_L2B_SHORT(udp_len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    img_header_t *img_hdr = (img_header_t *)(lst.pkt->data
							 | 
						||
| 
								 | 
							
								        + sizeof(eth_udp_header_t));
							 | 
						||
| 
								 | 
							
								    img_hdr->frame_id = frame_id;
							 | 
						||
| 
								 | 
							
								    img_hdr->pkt_id = pkt_id;
							 | 
						||
| 
								 | 
							
								    img_hdr->pkt_size = size;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // fill img data from piece
							 | 
						||
| 
								 | 
							
								    uint8_t *img_data = lst.pkt->data + sizeof(eth_udp_header_t)
							 | 
						||
| 
								 | 
							
								            + sizeof(img_header_t);
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(img_data, piece, size);
							 | 
						||
| 
								 | 
							
								    //os_mem_set(img_data, 0, size);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    pseudo_header_t *psd_hdr = (pseudo_header_t *)(lst.pkt->data
							 | 
						||
| 
								 | 
							
								        + sizeof(eth_header_t) + sizeof(ip_header_t) - sizeof(pseudo_header_t));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(psd_hdr->src, src_ip, sizeof(src_ip));
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(psd_hdr->dst, dst_ip, sizeof(dst_ip));
							 | 
						||
| 
								 | 
							
								    psd_hdr->len = udp_hdr->udp_len;
							 | 
						||
| 
								 | 
							
								    psd_hdr->protocol = UDP_PROTOCOL;
							 | 
						||
| 
								 | 
							
								    psd_hdr->mbz = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    udp_hdr->chk_sum = 0;
							 | 
						||
| 
								 | 
							
								    udp_hdr->chk_sum = chksum(psd_hdr, udp_len + sizeof(pseudo_header_t));
							 | 
						||
| 
								 | 
							
								    udp_hdr->chk_sum = SWAP_L2B_SHORT(udp_hdr->chk_sum);
							 | 
						||
| 
								 | 
							
								#else   /* udp packet and hw checksum */
							 | 
						||
| 
								 | 
							
								    udp_header_t *udp_hdr = (udp_header_t *)(lst.pkt->data
							 | 
						||
| 
								 | 
							
								        + sizeof(eth_header_t) + sizeof(ip_header_t));
							 | 
						||
| 
								 | 
							
								    pseudo_header_t *psd_hdr = (pseudo_header_t *)(lst.pkt->data
							 | 
						||
| 
								 | 
							
								        + sizeof(eth_header_t) + sizeof(ip_header_t) - sizeof(pseudo_header_t));
							 | 
						||
| 
								 | 
							
								    uint16_t udp_chksum =0;
							 | 
						||
| 
								 | 
							
								    udp_hdr->chk_sum = 0;
							 | 
						||
| 
								 | 
							
								    udp_hdr->udp_len = SWAP_L2B_SHORT(udp_len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // fill udp header data
							 | 
						||
| 
								 | 
							
								    udp_header_t tmp_uh = {0};
							 | 
						||
| 
								 | 
							
								    tmp_uh.src_port = g_udp_src_port;
							 | 
						||
| 
								 | 
							
								    tmp_uh.dst_port = g_udp_dst_port;
							 | 
						||
| 
								 | 
							
								    tmp_uh.udp_len = SWAP_L2B_SHORT(udp_len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // fill img header data
							 | 
						||
| 
								 | 
							
								    img_header_t tmp_ih = {0};
							 | 
						||
| 
								 | 
							
								    tmp_ih.frame_id = frame_id;
							 | 
						||
| 
								 | 
							
								    tmp_ih.pkt_id = pkt_id;
							 | 
						||
| 
								 | 
							
								    tmp_ih.pkt_size = size;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    pseudo_header_t tmp_ph = {0};
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(tmp_ph.src, src_ip, sizeof(src_ip));
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(tmp_ph.dst, dst_ip, sizeof(dst_ip));
							 | 
						||
| 
								 | 
							
								    tmp_ph.len = udp_hdr->udp_len;
							 | 
						||
| 
								 | 
							
								    tmp_ph.protocol = UDP_PROTOCOL;
							 | 
						||
| 
								 | 
							
								    tmp_ph.mbz = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    g_chksum_buf_t[0].src = (uint8_t *)&tmp_ph;
							 | 
						||
| 
								 | 
							
								    g_chksum_buf_t[0].len = sizeof(pseudo_header_t);
							 | 
						||
| 
								 | 
							
								    g_chksum_buf_t[1].src = (uint8_t *)&tmp_uh;
							 | 
						||
| 
								 | 
							
								    g_chksum_buf_t[1].len = sizeof(udp_header_t);
							 | 
						||
| 
								 | 
							
								    g_chksum_buf_t[2].src = (uint8_t *)&tmp_ih;
							 | 
						||
| 
								 | 
							
								    g_chksum_buf_t[2].len = sizeof(img_header_t);
							 | 
						||
| 
								 | 
							
								    g_chksum_buf_t[3].src = (uint8_t *)piece;
							 | 
						||
| 
								 | 
							
								    g_chksum_buf_t[3].len = size;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uint16_t total_len = sizeof(pseudo_header_t) + sizeof(udp_header_t) + sizeof(img_header_t) + size;
							 | 
						||
| 
								 | 
							
								    eth_chksum_get(g_chksum_buf_t, 4, psd_hdr, total_len, &udp_chksum);
							 | 
						||
| 
								 | 
							
								    udp_hdr->chk_sum = SWAP_L2B_SHORT(udp_chksum);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // ip header
							 | 
						||
| 
								 | 
							
								    ip_header_t *ip_hdr = (ip_header_t *)(lst.pkt->data + sizeof(eth_header_t));
							 | 
						||
| 
								 | 
							
								    ip_hdr->version = 4;
							 | 
						||
| 
								 | 
							
								    ip_hdr->hdr_len = 5;
							 | 
						||
| 
								 | 
							
								    ip_hdr->tos = 0;
							 | 
						||
| 
								 | 
							
								    ip_hdr->tot_len = SWAP_L2B_SHORT(udp_frame_size - sizeof(eth_header_t));
							 | 
						||
| 
								 | 
							
								    ip_hdr->id = SWAP_L2B_SHORT(8627);
							 | 
						||
| 
								 | 
							
								    ip_hdr->frag_off = SWAP_L2B_SHORT(0);
							 | 
						||
| 
								 | 
							
								    ip_hdr->ttl = 64;
							 | 
						||
| 
								 | 
							
								    ip_hdr->protocol = 17;
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(ip_hdr->srcaddr, src_ip, sizeof(src_ip));
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(ip_hdr->dstaddr, dst_ip, sizeof(dst_ip));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if 0   // sw checksum
							 | 
						||
| 
								 | 
							
								    ip_hdr->chk_sum = 0;
							 | 
						||
| 
								 | 
							
								    ip_hdr->chk_sum = chksum(ip_hdr, sizeof(ip_header_t));
							 | 
						||
| 
								 | 
							
								    ip_hdr->chk_sum = SWAP_L2B_SHORT(ip_hdr->chk_sum);
							 | 
						||
| 
								 | 
							
								#else  // hw checksum
							 | 
						||
| 
								 | 
							
								    uint16_t chksum =0;
							 | 
						||
| 
								 | 
							
								    ip_header_t test_ip_head = {0};
							 | 
						||
| 
								 | 
							
								    g_chksum_buf_t[0].src = (uint8_t *)ip_hdr;
							 | 
						||
| 
								 | 
							
								    g_chksum_buf_t[0].len = sizeof(ip_header_t);
							 | 
						||
| 
								 | 
							
								    ip_hdr->chk_sum = 0;
							 | 
						||
| 
								 | 
							
								    eth_chksum_get(g_chksum_buf_t, 1, &test_ip_head, sizeof(ip_header_t), &chksum);
							 | 
						||
| 
								 | 
							
								    ip_hdr->chk_sum = SWAP_L2B_SHORT(chksum);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    // eth header
							 | 
						||
| 
								 | 
							
								    eth_header_t *eth_hdr = (eth_header_t *)lst.pkt->data;
							 | 
						||
| 
								 | 
							
								    dwc_mac_addr_get(g_emac_ctrl, (uint8_t *)eth_hdr->src_mac);
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(eth_hdr->dst_mac, dst_mac, sizeof(dst_mac));
							 | 
						||
| 
								 | 
							
								    eth_hdr->eth_type = g_eth_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* send udp packet */
							 | 
						||
| 
								 | 
							
								    dwc_eth_send_frame(g_emac_ctrl, &lst);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void eth_test_rcv(t_dwc_ctrl* p_ctrl, uint8_t * data, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    ///*
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    int i;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_printf("\r\nEth rcv (port=%d, pack_len=%d),packet dump :\r\n", p_ctrl->unit, len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for(i=0; i<len; i++)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										iot_printf("%2.2x ", data[i]);
							 | 
						||
| 
								 | 
							
										if((i+1)%16 == 0)
							 | 
						||
| 
								 | 
							
											iot_printf("\r\n");
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									//*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									iot_printf("\r\neth_test_rcv........\r\n");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t ai_get_frame_address();
							 | 
						||
| 
								 | 
							
								uint32_t ai_check_master_done();
							 | 
						||
| 
								 | 
							
								void ai_disable_auto();
							 | 
						||
| 
								 | 
							
								void ai_enable_auto();
							 | 
						||
| 
								 | 
							
								void ai_clear_master_done();
							 | 
						||
| 
								 | 
							
								void ai_enable_master();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t dvp_check_frame_done();
							 | 
						||
| 
								 | 
							
								void dvp_clear_frame_done();
							 | 
						||
| 
								 | 
							
								void dvp_disable_ram_auto();
							 | 
						||
| 
								 | 
							
								void dvp_enable_ram_auto();
							 | 
						||
| 
								 | 
							
								uint32_t dvp_get_idle_frame_addr();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8_t g_data_buf[IMG_LENGTH] = {0};  // test payload data
							 | 
						||
| 
								 | 
							
								uint32_t g_frame_cnt = 0;
							 | 
						||
| 
								 | 
							
								void test_send_packet() {
							 | 
						||
| 
								 | 
							
								#if (K3D_RUN_MODE == 1)
							 | 
						||
| 
								 | 
							
								    while(1) {
							 | 
						||
| 
								 | 
							
								        while(1){
							 | 
						||
| 
								 | 
							
								            //check AI's done bit;
							 | 
						||
| 
								 | 
							
								            if(ai_check_master_done()){
							 | 
						||
| 
								 | 
							
								                g_print_enable = 1;
							 | 
						||
| 
								 | 
							
								                iot_printf("\nai master done:%d", g_frame_cnt);
							 | 
						||
| 
								 | 
							
								                g_print_enable = 0;
							 | 
						||
| 
								 | 
							
								                g_frame_cnt++;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                //stop AI;
							 | 
						||
| 
								 | 
							
								                ai_disable_auto();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                ai_clear_master_done();
							 | 
						||
| 
								 | 
							
								                uint8_t *frame_ptr = (uint8_t*)ai_get_frame_address();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                for(uint16_t j = 0; j < IMG_WIDTH * IMG_BIT / 8; j++) {
							 | 
						||
| 
								 | 
							
								                    eth_test_send_udp(frame_ptr, IMG_LENGTH, g_frame_cnt, j);
							 | 
						||
| 
								 | 
							
								                    frame_ptr += IMG_LENGTH;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                //start AI;
							 | 
						||
| 
								 | 
							
								                ai_enable_auto();
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //enable AI's master again;
							 | 
						||
| 
								 | 
							
								        iot_printf("1 frame send out, restart ai master\n");
							 | 
						||
| 
								 | 
							
								        ai_enable_master();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#elif (K3D_RUN_MODE ==2)
							 | 
						||
| 
								 | 
							
								    while(1) {
							 | 
						||
| 
								 | 
							
								        while(1) {
							 | 
						||
| 
								 | 
							
								            if (dvp_check_frame_done()) {
							 | 
						||
| 
								 | 
							
								                g_print_enable = 1;
							 | 
						||
| 
								 | 
							
								                iot_printf("\ndvp frame done: %d\n", g_frame_cnt);
							 | 
						||
| 
								 | 
							
								                g_print_enable = 0;
							 | 
						||
| 
								 | 
							
								                g_frame_cnt++;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                // stop dvp raw mode
							 | 
						||
| 
								 | 
							
								                dvp_disable_ram_auto();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                // clear done bit
							 | 
						||
| 
								 | 
							
								                dvp_clear_frame_done();
							 | 
						||
| 
								 | 
							
								                ahb_dmc_cache_clear();
							 | 
						||
| 
								 | 
							
								                uint8_t *frame_ptr = (uint8_t*)dvp_get_idle_frame_addr();
							 | 
						||
| 
								 | 
							
								                for(uint16_t j = 0; j < IMG_WIDTH * IMG_BIT / 8; j++) {
							 | 
						||
| 
								 | 
							
								                    eth_test_send_udp(frame_ptr, IMG_LENGTH, g_frame_cnt, j);
							 | 
						||
| 
								 | 
							
								                    frame_ptr += IMG_LENGTH;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // enable dvp ram mode
							 | 
						||
| 
								 | 
							
								        dvp_enable_ram_auto();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    while(1) {
							 | 
						||
| 
								 | 
							
								        while(1) {
							 | 
						||
| 
								 | 
							
								            if (1) {
							 | 
						||
| 
								 | 
							
								                g_print_enable = 1;
							 | 
						||
| 
								 | 
							
								                iot_printf("\nprint done: %d\n", g_frame_cnt);
							 | 
						||
| 
								 | 
							
								                g_print_enable = 1;
							 | 
						||
| 
								 | 
							
								                g_frame_cnt++;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                uint8_t *frame_ptr = (uint8_t *) 0x10400000;
							 | 
						||
| 
								 | 
							
								                for(uint16_t j = 0; j < IMG_WIDTH * IMG_BIT / 8; j++) {
							 | 
						||
| 
								 | 
							
								                    eth_test_send_udp(frame_ptr, IMG_LENGTH, g_frame_cnt, j);
							 | 
						||
| 
								 | 
							
								                    frame_ptr += IMG_LENGTH;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void send_pack_task(void *arg)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    iot_printf("task 1 entry....\n");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for(;;) {
							 | 
						||
| 
								 | 
							
								       test_send_packet();
							 | 
						||
| 
								 | 
							
								       os_delete_task(test_send_handle);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void dma_chksum_init()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    dma_verify cfg = {0};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cfg.ver_mode = DMA_CHKSUM;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dma_sw_init(DMA_SW_TYPE_POLL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dma_sw_open(DMA_ETH_CHKSUM, (dma_int_handler)dma_handler, &cfg);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int eth_gpio_rst(uint8_t gpio)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t r = 1;
							 | 
						||
| 
								 | 
							
								    iot_printf("reset gpio start\n");
							 | 
						||
| 
								 | 
							
								    r = iot_gpio_open_as_output(gpio);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if(r != 0)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    	iot_printf("\ngpio_set_direction failed!\n");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (0 != iot_gpio_value_set(gpio, 1)) {
							 | 
						||
| 
								 | 
							
								        iot_printf("\n WRITE 0 FAILED\n");
							 | 
						||
| 
								 | 
							
								        r = 1;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        os_delay(100);
							 | 
						||
| 
								 | 
							
								        if (0 != iot_gpio_value_set(gpio, 0)) {
							 | 
						||
| 
								 | 
							
								            iot_printf("\n WRITE 1 FAILED\n");
							 | 
						||
| 
								 | 
							
								            r = 1;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            r = 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        os_delay(100);
							 | 
						||
| 
								 | 
							
								        if (0 != iot_gpio_value_set(gpio, 1)) {
							 | 
						||
| 
								 | 
							
								            iot_printf("\n WRITE 1 FAILED\n");
							 | 
						||
| 
								 | 
							
								            r = 1;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            r = 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    iot_printf("reset gpio\n");
							 | 
						||
| 
								 | 
							
								    return r;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define FLASH_REF_ADDR  0x1c012000
							 | 
						||
| 
								 | 
							
								#define FLASH_REF_TYPE  imgCFG
							 | 
						||
| 
								 | 
							
								#define AI_REF_RAM_ADDR 0x73060000
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int ref_img_copy( )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t *dst= (uint8_t*)AI_REF_RAM_ADDR;
							 | 
						||
| 
								 | 
							
								    uint8_t *src = (uint8_t*)FLASH_REF_ADDR;
							 | 
						||
| 
								 | 
							
								    char block[64];
							 | 
						||
| 
								 | 
							
								    imgHdr hdr = {0};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(block, src, sizeof(imgHdr));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    img_header_construct(&hdr, block);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (iot_imghdr_get_imgType(&hdr) != FLASH_REF_TYPE) {
							 | 
						||
| 
								 | 
							
								        return 1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(dst, src+sizeof(imgHdr), iot_imghdr_get_imgSize(&hdr));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int eth_init(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* init common modules */
							 | 
						||
| 
								 | 
							
								    iot_bitops_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* init os related modules and utilities */
							 | 
						||
| 
								 | 
							
								    os_utils_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* init dbglog module */
							 | 
						||
| 
								 | 
							
								    //iot_dbglog_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* init ipc module */
							 | 
						||
| 
								 | 
							
								    //iot_ipc_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //dbg_uart_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_pkt_init(&test_pkt_config);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_share_task_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //iot_dbg_uart_set_port(IOT_UART_PORT0, 3000000, 0, 8, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (K3D_RUN_MODE == 1) || (K3D_RUN_MODE == 2)
							 | 
						||
| 
								 | 
							
								    camera_module_init();
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (K3D_RUN_MODE == 1)
							 | 
						||
| 
								 | 
							
								    uint8_t ret = 1;
							 | 
						||
| 
								 | 
							
								    ret = ref_img_copy();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ai_depth_auto_mode_cfg();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (ret) {
							 | 
						||
| 
								 | 
							
								        iot_printf("Load reference binary image from flash failed.\n");
							 | 
						||
| 
								 | 
							
								        iot_printf("Capture image now.\n");
							 | 
						||
| 
								 | 
							
								        ai_ref_pic_capture();
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        iot_printf("load reference binary image successful\n");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#elif (K3D_RUN_MODE == 2)
							 | 
						||
| 
								 | 
							
								    ai_ram_auto_mode_cfg();
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* dma init, use it for check sum */
							 | 
						||
| 
								 | 
							
								    dma_chksum_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (K3D_RUN_MODE == 1) || (K3D_RUN_MODE == 2)
							 | 
						||
| 
								 | 
							
								    eth_gpio_rst(45);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dwc_eth_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    g_emac_ctrl = dwc_eth_open(EMAC_TEST_UNIT, eth_test_rcv);
							 | 
						||
| 
								 | 
							
								    dwc_eth_start(g_emac_ctrl);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    eth_gpio_dump();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dwc_gpio_bind(EMAC_TEST_UNIT);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    /* start plc lib task */
							 | 
						||
| 
								 | 
							
								    test_send_handle = os_create_task(send_pack_task, NULL, 9);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //create the tasks;
							 | 
						||
| 
								 | 
							
								    if(test_send_handle != NULL) {
							 | 
						||
| 
								 | 
							
								        iot_printf("task 2 init successfully...\n");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void init_task(void *arg)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    iot_printf("task 1 entry....\n");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for(;;) {
							 | 
						||
| 
								 | 
							
								       eth_init();
							 | 
						||
| 
								 | 
							
								       os_delete_task(test_init_handle);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int32_t iot_task_init()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* start plc lib task */
							 | 
						||
| 
								 | 
							
								    test_init_handle = os_create_task(init_task, NULL, 9);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //create the tasks;
							 | 
						||
| 
								 | 
							
								    if(test_init_handle != NULL) {
							 | 
						||
| 
								 | 
							
								        iot_printf("task 1 init successfully...\n");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int32_t iot_task_start()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    //start the tasks;
							 | 
						||
| 
								 | 
							
								    os_start_kernel();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static int32_t iot_platform_init()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /*platform intialization*/
							 | 
						||
| 
								 | 
							
								    platform_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //resource initializations;
							 | 
						||
| 
								 | 
							
								    system_clock_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //system_uart_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dbg_uart_init_port(0, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (K3D_RUN_MODE == 1) || (K3D_RUN_MODE == 2)
							 | 
						||
| 
								 | 
							
								    ddr_module_cache_cfg();
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int32_t iot_module_init(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    //platform intialization;
							 | 
						||
| 
								 | 
							
								    iot_platform_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //create all the tasks;
							 | 
						||
| 
								 | 
							
								    iot_task_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_printf("starting OS...\n");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   //module init;
							 | 
						||
| 
								 | 
							
								   iot_module_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   //module start;
							 | 
						||
| 
								 | 
							
								   iot_task_start();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |