commit 895ebd7d98f4813f0dbe7c827e707b56d1980ebe Author: cfif Date: Mon May 26 14:41:45 2025 +0300 Init diff --git a/Inc/tcp_server.h b/Inc/tcp_server.h new file mode 100644 index 0000000..c5983eb --- /dev/null +++ b/Inc/tcp_server.h @@ -0,0 +1,91 @@ +/** + ************************************************************************** + * @file tcp_server.h + * @version v2.0.4 + * @date 2021-12-31 + * @brief tcp server header + ************************************************************************** + * Copyright notice & Disclaimer + * + * The software Board Support Package (BSP) that is made available to + * download from Artery official website is the copyrighted work of Artery. + * Artery authorizes customers to use, copy, and distribute the BSP + * software and its related documentation for the purpose of design and + * development in conjunction with Artery microcontrollers. Use of the + * software is governed by this copyright notice and the following disclaimer. + * + * THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES, + * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS, + * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR + * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS, + * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. + * + ************************************************************************** + */ + +#ifndef _TCP_SERVER_H_ +#define _TCP_SERVER_H_ + +#include "cmsis_os2.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup AT32F437_periph_examples + * @{ + */ + +/** @addtogroup 437_EMAC_tcp_server + * @{ + */ + +/** @defgroup TCP_server_definition + * @{ + */ + +/*TCP server port*/ +#define TCP_LOCAL_PORT (1030) + + +#define ETH_OK "OK" +#define ETH_ERR "ERR" + +typedef struct { + struct { + uint32_t com; + uint32_t addressStart; + uint32_t blockCount; + } BlockInfo; + uint32_t blockCounter; + uint32_t flashPointer; +} tCom01; + +/** + * @} + */ + +/** @defgroup TCP_server_prototype + * @{ + */ +void tcp_server_init(void); +void vInitEthServer(); +void taskEthServer(void *env); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Src/tcp_server.c b/Src/tcp_server.c new file mode 100644 index 0000000..17f9970 --- /dev/null +++ b/Src/tcp_server.c @@ -0,0 +1,237 @@ +/** + ************************************************************************** + * @file tcp_server.c + * @version v2.0.4 + * @date 2021-12-31 + * @brief implement tcp server + ************************************************************************** + * Copyright notice & Disclaimer + * + * The software Board Support Package (BSP) that is made available to + * download from Artery official website is the copyrighted work of Artery. + * Artery authorizes customers to use, copy, and distribute the BSP + * software and its related documentation for the purpose of design and + * development in conjunction with Artery microcontrollers. Use of the + * software is governed by this copyright notice and the following disclaimer. + * + * THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES, + * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS, + * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR + * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS, + * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. + * + ************************************************************************** + */ + +#include "tcp_server.h" +#include "http_server.h" +#include "lwip/err.h" +#include "lwip/tcp.h" +#include "string.h" +#include "at32_emac.h" +#include "netconf.h" +#include "SystemDelayInterface.h" +#include "at32f435_437.h" +#include "cmsis_os2.h" + +/** @addtogroup AT32F437_periph_examples + * @{ + */ + +/** @addtogroup 437_EMAC_tcp_server + * @{ + */ + +/** + * @brief receive and transmit tcp data + * @param arg: the user argument + * @param pcb: the tcp_pcb that has received the data + * @param p: the packet buffer + * @param err: the error value linked with the received data + * @retval error value + */ + + +// uint8_t dataHTTP[2048]; +// uint32_t dataHTTP_len; + +uint32_t com = 0; +uint8_t flashProgramming = 0; +tCom01 com01; +uint8_t bufWriteTcp[1600]; + +static err_t tcp_server_recv(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err) { +// char* pPrintBuf; + if(p != NULL) { + + tcp_recved(pcb, p->tot_len); + + if (!flashProgramming) { + memcpy(&com, p->payload, sizeof(com)); + +// if (com == 0x02) { +// tcp_write(pcb, dataHTTP, dataHTTP_len, 1); +// } + + + if (com == 0x01) { + memcpy(&com01.BlockInfo, p->payload, sizeof(com01.BlockInfo)); + com01.blockCounter = 0; + com01.flashPointer = FileTableDescriptorAddress; + + flash_status_type status; + flash_unlock(); + uint32_t sectorAddress = FileTableDescriptorAddress; + for (int i=0; i<16; ++i) { + status = flash_block_erase(sectorAddress); + if (FLASH_OPERATE_DONE != status) { + //flash_lock(); + break; + } + sectorAddress += 0x10000; + } + //flash_status_type status = flash_bank2_erase(); + flash_lock(); + + if (status != FLASH_OPERATE_DONE) { + pbuf_free(p); + tcp_write(pcb, ETH_ERR, strlen(ETH_ERR), 1); + return 0; + } else { + flashProgramming = 1; + tcp_write(pcb, ETH_OK, strlen(ETH_OK), 1); + } + } + + pbuf_free(p); + } else { + + flash_unlock(); + for (uint32_t i=0; itot_len / 4; ++i) { + + pbuf_copy_partial(p, bufWriteTcp, p->tot_len, 0); + pbuf_free(p); + flash_word_program(com01.flashPointer, ((uint32_t *) bufWriteTcp)[i]); + + if (((uint32_t*)com01.flashPointer)[0] != ((uint32_t*)bufWriteTcp)[i]) { + flash_lock(); + tcp_write(pcb, ETH_ERR, strlen(ETH_ERR), 1); + flashProgramming = 0; + return 0; + } + + com01.flashPointer += 4; + } + flash_lock(); + + ++com01.blockCounter; + if (com01.blockCounter == com01.BlockInfo.blockCount) { + flashProgramming = 0; + } + + tcp_write(pcb, ETH_OK, strlen(ETH_OK), 1); + } + + //tcp_recved(pcb, p->tot_len); /* Get data length; tot_len: length of tcp data block */ + //tcp_write(pcb,p->payload,p->tot_len,TCP_WRITE_FLAG_COPY); /* payload is starting position of TCP data block */ + //tcp_output(pcb); + + } else { + tcp_close(pcb); /* TCP server shouldn't close this session actively */ + } + //pbuf_free(p); /* free the TCP segment */ + //free(pPrintBuf); + err = ERR_OK; + return err; +} + +/** + * @brief callback function for receiving data + * @param arg: user supplied argument + * @param pcb: the tcp_pcb which accepted the connection + * @param err: error value + * @retval error value + */ + +static err_t tcp_server_accept(void *arg,struct tcp_pcb *pcb,err_t err) +{ + tcp_setprio(pcb, TCP_PRIO_MIN); /* set the priority of callback function, if there are multiple session exist, this function must be called */ + tcp_recv(pcb,tcp_server_recv); /* set callbacl function for TCP segments come in */ + + err = ERR_OK; + return err; +} + +/** + * @brief initialize tcp server + * @param none + * @retval none + */ + + + +void tcp_server_init(void) +{ + struct tcp_pcb *pcb; + err_t err; + /*****************************************************/ + pcb = tcp_new(); /* create TCP protocol control block for communication */ + if (!pcb) + { + return ; + } + err = tcp_bind(pcb,IP_ADDR_ANY,TCP_LOCAL_PORT); /* bind local IP and port for TCP server */ + if(err != ERR_OK) + { + return ; + } + pcb = tcp_listen(pcb); /* entering listening status */ + tcp_accept(pcb,tcp_server_accept); /* set callback function for connection requestion */ + +} + +/* +void EMAC_IRQHandler(void) { + while(emac_received_packet_size_get() != 0) { + lwip_pkt_handle(); + } + + emac_dma_flag_clear(EMAC_DMA_RI_FLAG); + emac_dma_flag_clear(EMAC_DMA_NIS_FLAG); +} +*/ + +/* +void httpd_init(void); + +void vInitEthServer() { + nvic_priority_group_config(NVIC_PRIORITY_GROUP_4); + error_status status = emac_system_init(); + + while(status == ERROR); + + tcpip_stack_init(); + tcp_server_init(); + httpd_init(); +} +*/ +/* +void taskEthServer(void *env) { + + for (;;) { + lwip_periodic_handle(SystemGetMs()); + + SystemDelayMs(300); + } +} +*/ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..f5e4909 --- /dev/null +++ b/modular.json @@ -0,0 +1,17 @@ +{ + "dep": [ + { + "type": "git", + "provider": "GONEC_NEW", + "repo": "lwip_ARTERY_AT32" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file