void irq_handler(){ uint32_t pending = inw(VIC_VBASE+INTERRUPT_STATUS); uint32_t irq = 0; while(pending > 0){ irq = inw(VIC_VBASE+INTERRUPT_NUMBER); if(actions[irq].handler){ (*actions[irq].handler)(irq, actions[irq].opaque); }else{ pic_disable(irq); } pending = inw(VIC_VBASE+INTERRUPT_STATUS); } #if 0 if(status & (1<<TIMER0_IRQ)){ //kprintf("@"); ticks++; //assert(pls_read(current) != NULL); run_timer_list(); clock_clear(); } if( status & (1<<UART_IRQ) ){ //if ((c = cons_getc()) == 13) { // debug_monitor(tf); //} //else { extern void dev_stdin_write(char c); char c = cons_getc(); dev_stdin_write(c); //} //kprintf("#"); serial_clear(); } #endif }
/** Note: Must _not_ be called twice! */ WINDOW *initscr(void) { int i; // newterm(name, stdout, stdin); // def_prog_mode(); for (i = 0; i < 128; i++) acs_map[i] = (chtype) i | A_ALTCHARSET; #if IS_ENABLED(CONFIG_LP_SERIAL_CONSOLE) if (curses_flags & F_ENABLE_SERIAL) { serial_clear(); } #endif #if IS_ENABLED(CONFIG_LP_VIDEO_CONSOLE) if (curses_flags & F_ENABLE_CONSOLE) { /* Clear the screen and kill the cursor */ video_console_clear(); video_console_cursor_enable(0); } #endif // Speaker init? stdscr = newwin(SCREEN_Y, SCREEN_X, 0, 0); // TODO: curscr, newscr? werase(stdscr); return stdscr; }
/* * 串口波特率设置 */ int serial_set_baudrate(urg_serial_t *serial, long baudrate) { long baudrate_value = -1; switch (baudrate) { case 4800: baudrate_value = B4800; break; case 9600: baudrate_value = B9600; break; case 19200: baudrate_value = B19200; break; case 38400: baudrate_value = B38400; break; case 57600: baudrate_value = B57600; break; case 115200: baudrate_value = B115200; break; default: return -1; } /* 设置输入输出波特率(Linux系统调用) */ cfsetospeed(&serial->sio, baudrate_value); cfsetispeed(&serial->sio, baudrate_value); /* 设置终端属性 */ tcsetattr(serial->fd, TCSADRAIN, &serial->sio); serial_clear(serial); return 0; }
/* �{�[���[�g�̐ݒ� */ int serial_setBaudrate(serial_t *serial, long baudrate) { long baudrate_value = -1; switch (baudrate) { case 4800: baudrate_value = B4800; break; case 9600: baudrate_value = B9600; break; case 19200: baudrate_value = B19200; break; case 38400: baudrate_value = B38400; break; case 57600: baudrate_value = B57600; break; case 115200: baudrate_value = B115200; break; default: return SerialSetBaudrateFail; } /* �{�[���[�g�ύX */ cfsetospeed(&serial->sio_, baudrate_value); cfsetispeed(&serial->sio_, baudrate_value); tcsetattr(serial->fd_, TCSADRAIN, &serial->sio_); serial_clear(serial); return 0; }
static int urg_firstConnection(urg_t *urg, long baudrate) { long try_baudrates[] = { 115200, 19200, 38400 }; int try_size = sizeof(try_baudrates) / sizeof(try_baudrates[0]); long pre_ticks; int reply = 0; int ret; int i; /* The baud rate to be connected is replaced with the first element of the array. */ for (i = 1; i < try_size; ++i) { if (baudrate == try_baudrates[i]) { long swap_tmp = try_baudrates[i]; try_baudrates[i] = try_baudrates[0]; try_baudrates[0] = swap_tmp; break; } } /* Try to connect with the specified baudrate , and check for response */ for (i = 0; i < try_size; ++i) { /* Change host side baudrate */ ret = serial_setBaudrate(&urg->serial_, try_baudrates[i]); if (ret < 0) { return ret; } serial_clear(&urg->serial_); /* Send QT command */ ret = scip_qt(&urg->serial_, &reply, ScipWaitReply); if (ret == UrgSerialRecvFail) { /* If there is no response, consider that there is mismatch in baudrate */ continue; } if ((ret == UrgMismatchResponse) && (reply != -0xE)) { /* Process when response from MD/MS command is received */ /* Read out all data and then proceed for the next one */ /* (reply == -0xE) means SCIP1.1 error 'E' */ serial_clear(&urg->serial_); serial_skip(&urg->serial_, ScipTimeout, EachTimeout); reply = 0x00; } /* If the response is returned, consider that sensor is already in SCIP2.0 mode and no need to send SCIP2.0 */ if (reply != 0x00) { if ((ret = scip_scip20(&urg->serial_)) < 0) { /* If there is no response , continue with other baudrate */ continue; } if (ret == 12) { /* SCIP1.1 protocol */ return UrgScip10; } } /* Returns if there is no need to change baudrate */ if (baudrate == try_baudrates[i]) { return 0; } /* Change the baud rate as specified by URG */ pre_ticks = urg_ticks(); if (scip_ss(&urg->serial_, baudrate) < 0) { return UrgSsFail; } else { /* In case of serial communication, it is necessary to wait for one scan after baud rate is changed. */ long reply_msec = urg_ticks() - pre_ticks; urg_delay((reply_msec * 4 / 3) + 10); return serial_setBaudrate(&urg->serial_, baudrate); } } return UrgAdjustBaudrateFail; }
void serial_init(serial_t *obj, PinName tx, PinName rx) { uint32_t uart_ctrl = 0; /* Determine the UART to use */ UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx); if ((int)uart == NC) { error("Serial pinout mapping failed"); return; } obj->uart = (CMSDK_UART_TypeDef *)uart; if (tx != NC) { uart_ctrl = 0x01; /* TX enable */ } if (rx != NC) { uart_ctrl |= 0x02; /* RX enable */ } switch (uart) { case UART_0: CMSDK_UART0->CTRL = uart_ctrl; obj->index = 0; break; case UART_1: CMSDK_UART1->CTRL = uart_ctrl; obj->index = 1; break; case UART_2: CMSDK_UART2->CTRL = 0; obj->index = 2; pin_function(tx, ALTERNATE_FUNC); pin_function(rx, ALTERNATE_FUNC); CMSDK_UART2->CTRL = uart_ctrl; break; case UART_3: CMSDK_UART3->CTRL = 0; obj->index = 3; pin_function(tx, ALTERNATE_FUNC); pin_function(rx, ALTERNATE_FUNC); CMSDK_UART3->CTRL = uart_ctrl; break; case UART_4: CMSDK_UART4->CTRL = 0; obj->index = 4; pin_function(tx, ALTERNATE_FUNC); pin_function(rx, ALTERNATE_FUNC); CMSDK_UART4->CTRL = uart_ctrl; break; } /* Set default baud rate and format */ serial_baud(obj, 9600); /* * The CMSDK APB UART doesn't have support for flow control. * Ref. DDI0479C_cortex_m_system_design_kit_r1p0_trm.pdf */ uart_data[obj->index].sw_rts.pin = NC; uart_data[obj->index].sw_cts.pin = NC; if (uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } /* Clear UART */ serial_clear(obj); }