/* Defined by the application code, but called by FreeRTOS+UDP when the network connects/disconnects (if ipconfigUSE_NETWORK_EVENT_HOOK is set to 1 in FreeRTOSIPConfig.h). */ void vApplicationIPNetworkEventHook(eIPCallbackEvent_t eNetworkEvent) { uint32_t ulIPAddress, ulNetMask, ulGatewayAddress, ulDNSServerAddress; static BaseType_t xTasksAlreadyCreated = pdFALSE; int8_t cBuffer[16]; char bufor[100]; /* Check this was a network up event, as opposed to a network down event. */ if (eNetworkEvent == eNetworkUp) { /* Create the tasks that use the IP stack if they have not already been created. */ if (xTasksAlreadyCreated == pdFALSE) { //if(xTaskCreate(vUDPTransmitCANFramesTask,"Tx CAN/UDP",UDPD_CAN_TX_SIZE,NULL,UDP_CAN_TX_PRIO,NULL)==pdPASS) print_console("Creating UDP/CAN Tx task -- > OK\r\n"); // else print_console("Creating UDP/CAN Tx -- > failed\r\n"); SNTP_init(); //daj znac taskowi do obslugi http/ftp,ze moze utworzyc sockety #if ipconfigUSE_HTTP==1 || ipconfigUSE_FTP==1 xTaskNotifyGive(xServerWorkTaskHandle); #endif xTasksAlreadyCreated = pdTRUE; } /* The network is up and configured. Print out the configuration, which may have been obtained from a DHCP server. */ FreeRTOS_GetAddressConfiguration(&ulIPAddress, &ulNetMask, &ulGatewayAddress, &ulDNSServerAddress); print_console("\r\n-----------------------\r\n\r\n"); /* Convert the IP address to a string then print it out. */ FreeRTOS_inet_ntoa(ulIPAddress, cBuffer); sprintf(bufor, "IP Address: %s\r\n", cBuffer); print_console(bufor); gdb.sys.ipaddress = ulIPAddress; /* Convert the net mask to a string then print it out. */ FreeRTOS_inet_ntoa(ulNetMask, cBuffer); sprintf(bufor, "Subnet Mask: %s\r\n", cBuffer); print_console(bufor); gdb.sys.maskaddress = ulNetMask; /* Convert the IP address of the gateway to a string then print it out. */ FreeRTOS_inet_ntoa(ulGatewayAddress, cBuffer); sprintf(bufor, "Gateway IP Address: %s\r\n", cBuffer); print_console(bufor); gdb.sys.gwaddress = ulGatewayAddress; /* Convert the IP address of the DNS server to a string then print it out. */ FreeRTOS_inet_ntoa(ulDNSServerAddress, cBuffer); sprintf(bufor, "DNS server IP Address: %s\r\n", cBuffer); print_console(bufor); gdb.sys.dnsaddress = ulDNSServerAddress; } }
int fprintf_utf8(FILE *stream, const char *format, ...) { char *utmp = NULL; wchar_t *wout = NULL; int ret = -1; while (1) { va_list argptr; if (!(utmp = (char *)malloc(32768*sizeof(char)))) break; va_start(argptr, format); ret = vsprintf(utmp, format, argptr); va_end(argptr); if (ret < 0) break; if (!(wout = wchar_from_utf8(utmp))) { ret = -1; break; } ret = print_console(stream, wout, wcslen(wout)); break; } if (utmp) free(utmp); if (wout) free(wout); return ret; }
/*##########+++ CPU Decode Cycle +++##########*/ void decode(Emulator *emu, uint16_t instruction, bool disassemble) { Cpu *cpu = emu->cpu; Debugger *debugger = emu->debugger; int done = 0; uint8_t format_id; memset(debugger->mnemonic, 0, sizeof debugger->mnemonic); format_id = (uint8_t)(instruction >> 12); if (format_id == 0x1) { // format II (single operand) instruction // decode_formatII(emu, instruction, disassemble); } else if (format_id >= 0x2 && format_id <= 3) { // format III (jump) instruction // decode_formatIII(emu, instruction, disassemble); } else if (format_id >= 0x4) { // format I (two operand) instruction // decode_formatI(emu, instruction, disassemble); } else { char inv[100] = {0}; sprintf(inv, "%04X\t[INVALID INSTRUCTION]\n", instruction); print_console(emu, inv); printf("%s", inv); cpu->pc -= 2; cpu->running = false; debugger->debug_mode = true; } }
void SNTP_init(void) { #if ipconfigUSE_SNTP if(xTaskCreate(SNTP_thread,SNTP_THREAD_NAME,SNTP_THREAD_STACK_SIZE,NULL,SNTP_THREAD_PRIO,NULL)==pdPASS) print_console(s_task_create_ok); else print_console(s_task_create_fail); #endif }
int printf_utf8(const char *format, ...) { char *utmp = NULL; wchar_t *wout = NULL; int ret = -1; while (1) { va_list argptr; if (!(utmp = (char *)malloc(UTF8_BUFFER_SIZE*sizeof(char)))) break; va_start(argptr, format); ret = local_vsnprintf(utmp, UTF8_BUFFER_SIZE, format, argptr); va_end(argptr); if (ret < 0) break; if (!(wout = wchar_from_utf8(utmp))) { ret = -1; break; } ret = print_console(stdout, wout, wcslen(wout)); break; } if (utmp) free(utmp); if (wout) free(wout); return ret; }
void interpreter(char *cmd_buf, char len, void *tsm, char* cmd) { int i=0; int cmd_len = sizeof(comm_act)/sizeof(_action_command); //potnij stringi wzgledem spacji cut_cmd_str(cmd_buf, len); //nic nie wpisane, tylko ENTER poszedl ???[lp] if(!arg[0][0]) { // char str[3] = {' ', 0x08, "\0"}; //spacja, backspace, koniec stringa //wyslij spacje i skasuj ja print_console("\r\n"); //po tym wyslij znak zachety goto PROMPT; } // skopiuj komende tylko jesli bylo cos wpisane, sam enter pomija add_to_history_cmd(com_cmd_hist, cmd); //przeszukaj cala tablice komend for (; i< cmd_len; i++) { if(strncmp((char*)comm_act[i].command, arg[0], MAX_LEX_LEN) == 0) break; } //wykonaj komende, jesli wyskoczyl z petli przez: break; if(i<cmd_len) { print_console("\r\n"); comm_act[i].action(tsm); } else { //nie podejmuj akcji, komenda nierozpoznana print_console(cmd_not_found); } PROMPT: print_console(">"); }
int main(int argc, char** argv){ struct termios cfg, old; FILE* root = NULL; int gdbPort = 0; if(argc != 3 && argc != 2){ fprintf(stderr,"usage: %s path_to_disk [gdbPort]\n", argv[0]); return -1; } //setup the terminal { int ret; ret = tcgetattr(0, &old); cfg = old; if(ret) perror("cannot get term attrs"); #ifndef _DARWIN_ cfg.c_iflag &=~ (INLCR | INPCK | ISTRIP | IUCLC | IXANY | IXOFF | IXON); cfg.c_oflag &=~ (OPOST | OLCUC | ONLCR | OCRNL | ONOCR | ONLRET); cfg.c_lflag &=~ (ECHO | ECHOE | ECHONL | ICANON | IEXTEN | XCASE); #else cfmakeraw(&cfg); #endif ret = tcsetattr(0, TCSANOW, &cfg); if(ret) perror("cannot set term attrs"); } root = fopen64(argv[1], "r+b"); if(!root){ fprintf(stderr,"Failed to open root device\n"); exit(-1); } if(argc >= 3) gdbPort = atoi(argv[2]); start_mongoose(); init_console(); print_console(); //socInit(&soc, socRamModeAlloc, NULL, readchar, writechar, rootOps, root); socInit(&soc, socRamModeAlloc, NULL, get_one_keystroke, write_char_to_console, rootOps, root); signal(SIGINT, &ctl_cHandler); socRun(&soc, gdbPort); fclose(root); tcsetattr(0, TCSANOW, &old); return 0; }
void print_reply(const char *ifname, int count) { unsigned char buf[512]; size_t len; while(1) { len = sizeof(buf); if(get_reply(ifname, 5, buf, &len) == -1) break; print_console(buf, len); } }
int vfprintf_utf8(FILE *stream, const char *format, va_list argptr) { char *utmp = NULL; wchar_t *wout = NULL; int ret = -1; while (1) { if (!(utmp = (char *)malloc(UTF8_BUFFER_SIZE*sizeof(char)))) break; if ((ret = local_vsnprintf(utmp, UTF8_BUFFER_SIZE, format, argptr)) < 0) break; if (!(wout = wchar_from_utf8(utmp))) { ret = -1; break; } ret = print_console(stream, wout, wcslen(wout)); break; } if (utmp) free(utmp); if (wout) free(wout); return ret; }
// Task odbioru i analizy znakow z konsoli void vConsoleRxTask (void *pvparameters) { char special=0; char i = 0; char command_buffer[CMD_MAX_LEN]; char *ptr_cmd_buf = command_buffer; char onechar; //utworz kolejke znakow RxQueue = xQueueCreate(100, sizeof( portCHAR ) ); for (;;) { //vTaskDelay(10 / portTICK_RATE_MS); while(xQueueReceive(RxQueue,&onechar,portMAX_DELAY)) { // sprawdzamy wstepnie czy to znak specjalny (wszelkie strzalki, delete) if (onechar == 0x5b ||onechar == 0x1b) { special = 1; } //sprawdz czy to byla strzalka w gore else if (special && onechar == 0x41 ) { //skasuj wyswietlona z historii komende i przygotuj dla poprzedniej clean_term(ptr_cmd_buf); //wczytaj poprzednia komende przewinwtyl(com_cmd_hist, ptr_cmd_buf); //wyswietla te komnde na rs print_console(ptr_cmd_buf); //print_char(0, user.prom(&user)); i= (char)strlen(ptr_cmd_buf); // deaktywacja sekwencji sterujacej special = 0; } //przyjmuj tylko znaki z przedzialu a-z 0-9 spacja, enter, backspace,itd. //uwaga na strzalki, wysylaja po 2 znaki: A+costam oraz B+costam else if(( (onechar >= 'a' && onechar <= 'z') || (onechar >= 'A' && onechar <= 'Z') || (onechar >= '0' && onechar <= '9') || onechar == ' ' || onechar == '.' || onechar == '-' || onechar == '_' || onechar == '+' || onechar == '?' || onechar == '@' )&&(!special) ) { //echo dla wpisanego znaku usart_put_char(onechar); //zabezpieczenie przed przekroczeniem tablicy if(i < CMD_MAX_LEN) { *(ptr_cmd_buf + i) = onechar; i++; } } //sprawdz czy to byl backspace else if (onechar == BS) //backspace { //sprawdz czy index jest jeszcze w dopuszczlnym obszarze, //z lewej i z prawej strony if(i > 0 && i < CMD_MAX_LEN) { usart_put_char(BS); //wyczysc ostatni znak *(ptr_cmd_buf + i) = 0x0; //przesun o 1 do tylu aktualny indeks bufora i--; } } //jesli jakikolwiek inny klawisz ze znakow specjalnych else if(special) special = 0; //sprawdz czy to byl enter lub koniec transmisji else if (onechar == EOT || onechar ==LF || onechar ==CR_CM || onechar==ETB) { //usart_put_string("\r\n"); //usart_put_char((char*)LF); //usart_put_char((char*)CMD_PRMT); //zakoncz c-stringa znakiem konca= '\0' *(ptr_cmd_buf + i) = '\0'; //skopiuj te komende do kolejki przyjetych komend //add_to_history_cmd(com_cmd_hist, ptr_cmd_buf); //interpretacja komend interpreter(ptr_cmd_buf, i, NULL,ptr_cmd_buf); //przygotuj indeks pod nastepna komende na poczatek bufora i= 0; //byl ENTER, wiec ustaw ze nie kasuje nic STRZALKA W GORE wypisujaca z historii was_hist = 0; } } } }
BaseType_t xNetworkInterfaceInitialise(void) { HAL_StatusTypeDef hal_eth_init_status; uint8_t status = 0; /* Init ETH */ heth_global.Instance = ETH; heth_global.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE; heth_global.Init.Speed = ETH_SPEED_100M; heth_global.Init.DuplexMode = ETH_MODE_FULLDUPLEX; heth_global.Init.PhyAddress = DP83848_PHY_ADDRESS; heth_global.Init.MACAddr = &ucMACAddress[0]; heth_global.Init.RxMode = ETH_RXINTERRUPT_MODE; #if (ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM == 1) && (ipconfigDRIVER_INCLUDED_TX_IP_CHECKSUM == 1) heth_global.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE; #else heth_global.Init.ChecksumMode = ETH_CHECKSUM_BY_SOFTWARE; #endif heth_global.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII; hal_eth_init_status = HAL_ETH_Init(&heth_global); if (hal_eth_init_status == HAL_OK) { print_console(">> MAC init OK\r\n"); status = pdPASS; } else { return pdFAIL; print_console(">> MAC init failed\r\n"); } probePHY(&heth_global); /* Initialize Tx Descriptors list: Chain Mode */ HAL_ETH_DMATxDescListInit(&heth_global, DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB); //HAL_ETH_DMATxDescListInit(&heth_global, DMATxDscrTab, NULL, ETH_TXBUFNB); //InitializeZeroCopyBuffersTx(ETH_TXBUFNB,DMATxDscrTab); /* Initialize zero copy buffers */ //uint8_t* zerocopy_bufor_tab[ETH_RXBUFNB]; // tab to hold pointers to zero copy bufors /* Initialize Rx Descriptors list: Chain Mode */ HAL_ETH_DMARxDescListInit(&heth_global, DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB); /* Enable MAC and DMA transmission and reception */ HAL_ETH_Start(&heth_global); setPHYleds(&heth_global); #if PHY_LINK_CHANGE_INT uint32_t regvalue = 0; /**** Configure PHY to generate an interrupt when Eth Link state changes ****/ /* Read Register Configuration */ HAL_ETH_ReadPHYRegister(&heth_global, PHY_MICR, ®value); regvalue |= (PHY_MICR_INT_EN | PHY_MICR_INT_OE); /* Enable Interrupts */ HAL_ETH_WritePHYRegister(&heth_global, PHY_MICR, regvalue ); /* Read Register Configuration */ HAL_ETH_ReadPHYRegister(&heth_global, PHY_MISR, ®value); regvalue |= PHY_MISR_LINK_INT_EN; /* Enable Interrupt on change of link status */ HAL_ETH_WritePHYRegister(&heth_global, PHY_MISR, regvalue); #endif xTaskCreate(prvEMACDeferredInterruptHandlerTask, "EthRcvTask", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES-1, NULL); return status; }