361 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			361 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /****************************************************************************
 | ||
|  | 
 | ||
|  | Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. | ||
|  | 
 | ||
|  | This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics 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 "iot_gpio_api.h"
 | ||
|  | 
 | ||
|  | #include "apb_glb_reg.h"
 | ||
|  | #include "hw_reg_api.h"
 | ||
|  | 
 | ||
|  | #include "gpio_mtx_reg.h"
 | ||
|  | #include "pin_rf.h"
 | ||
|  | #include "gpio_mtx.h"
 | ||
|  | #include "iot_share_task.h"
 | ||
|  | 
 | ||
|  | 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, | ||
|  |         }, | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | void mdelay(uint32_t m) | ||
|  | { | ||
|  |     volatile int i= 0; | ||
|  | 
 | ||
|  |     for(int j = 0 ; j < m; j++){ | ||
|  |         for(i = 0; i < 1000000; i++); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | #include "iot_pkt.h"
 | ||
|  | #include "dwc_eth.h"
 | ||
|  | 
 | ||
|  | t_dwc_ctrl *g_emac_ctrl = NULL; | ||
|  | #define EMAC_TEST_UNIT  0
 | ||
|  | 
 | ||
|  | char arp_str[] = {0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x11,0x22,0x33, | ||
|  |             0x44,0x55, 0x08,0x06,0x00,0x01,0x08,0x00,0x06,0x04, | ||
|  |             0x00,0x01, 0x00,0x11,0x22,0x33,0x44,0x55, 0xc0,0xa8, | ||
|  |             0x04,0xa3, 0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0xa8, | ||
|  |             0x04,0x01, 0x00,0x00,0x00,0x00}; | ||
|  | 
 | ||
|  | char dst_ip[] = {192, 168, 4, 163}; | ||
|  | char src_ip[] = {192, 168, 4, 28}; | ||
|  | os_task_h test_init_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); | ||
|  | } | ||
|  | 
 | ||
|  | extern void dwc_gpio_bind(int unit); | ||
|  | void eth_test_send_ping(void) | ||
|  | { | ||
|  |     iot_pkt_ls lst; | ||
|  |     uint8_t * data, p_mac[6]; | ||
|  | 
 | ||
|  |     lst.pkt = iot_pkt_alloc(52, 0); | ||
|  |     lst.next = NULL; | ||
|  | 
 | ||
|  |     os_mem_cpy(lst.pkt->head, arp_str, sizeof(arp_str)); | ||
|  |     iot_pkt_set_data(lst.pkt, lst.pkt->head); | ||
|  |     iot_pkt_set_tail(lst.pkt, lst.pkt->data + sizeof(arp_str)); | ||
|  | 
 | ||
|  |     data = lst.pkt->data; | ||
|  | 
 | ||
|  |     dwc_mac_addr_get(g_emac_ctrl, p_mac); | ||
|  | 
 | ||
|  |     data[6] = p_mac[0]; | ||
|  |     data[7] = p_mac[1]; | ||
|  |     data[8] = p_mac[2]; | ||
|  |     data[9] = p_mac[3]; | ||
|  |     data[10] = p_mac[4]; | ||
|  |     data[11] = p_mac[5]; | ||
|  | 
 | ||
|  |     data[22] = p_mac[0]; | ||
|  |     data[23] = p_mac[1]; | ||
|  |     data[24] = p_mac[2]; | ||
|  |     data[25] = p_mac[3]; | ||
|  |     data[26] = p_mac[4]; | ||
|  |     data[27] = p_mac[5]; | ||
|  | 
 | ||
|  |     data[28] = src_ip[0]; | ||
|  |     data[29] = src_ip[1]; | ||
|  |     data[30] = src_ip[2]; | ||
|  |     data[31] = src_ip[3]; | ||
|  | 
 | ||
|  |     data[38] = dst_ip[0]; | ||
|  |     data[39] = dst_ip[1]; | ||
|  |     data[40] = dst_ip[2]; | ||
|  |     data[41] = dst_ip[3]; | ||
|  | 
 | ||
|  |     dwc_eth_send_frame(g_emac_ctrl, &lst); | ||
|  | 
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | 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\n"); | ||
|  | 
 | ||
|  |     mdelay(20); | ||
|  | 
 | ||
|  |     eth_test_send_ping(); | ||
|  | } | ||
|  | 
 | ||
|  | 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(); | ||
|  | 
 | ||
|  |     dwc_eth_init(); | ||
|  | 
 | ||
|  |     g_emac_ctrl = dwc_eth_open(EMAC_TEST_UNIT, eth_test_rcv); | ||
|  |     dwc_eth_start(g_emac_ctrl); | ||
|  | #if 0
 | ||
|  |     int cnt = 60; | ||
|  |     iot_printf("\r\n\r\nWait for initailization "); | ||
|  |     while(cnt--) | ||
|  |     { | ||
|  |         mdelay(1);/* Phy need time to reset. */ | ||
|  |         iot_printf("."); | ||
|  |     } | ||
|  |     iot_printf("\r\n"); | ||
|  | #endif
 | ||
|  |     eth_gpio_dump(); | ||
|  |     eth_test_send_ping(); | ||
|  |     dwc_gpio_bind(EMAC_TEST_UNIT); | ||
|  | 
 | ||
|  |     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(); | ||
|  | 
 | ||
|  |     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; | ||
|  | } | ||
|  | 
 | ||
|  | 
 |