⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serdrv.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    printf("[%d@%d] ", nread, rbindex);#endif    if (nread>0)       rbindex = rbindex+nread;    do {      restatus = Angel_RxEngine(readbuf[c], &(dc->dc_packet), &rxstate);#ifdef DO_TRACE      printf("<%02X ",readbuf[c]);      if (!(++c % 16))          printf("\n");#else      c++;#endif    } while (c<rbindex &&             ((restatus == RS_IN_PKT) || (restatus == RS_WAIT_PKT)));#ifdef DO_TRACE   if (c % 16)        printf("\n");#endif    switch(restatus) {            case RS_GOOD_PKT:        ret_code = 1;        /* fall through to: */      case RS_BAD_PKT:        /*         * We now need to shuffle any left over data down to the         * beginning of our private buffer ready to be used          *for the next packet          */#ifdef DO_TRACE        printf("SerialRead() processed %d, moving down %d\n", c, rbindex-c);#endif        if (c != rbindex) memmove((char *) readbuf, (char *) (readbuf+c),                                  rbindex-c);        rbindex -= c;        break;      case RS_IN_PKT:      case RS_WAIT_PKT:        rbindex = 0;            /* will have processed all we had */        ret_code = 0;        break;      default:#ifdef DEBUG        printf("Bad re_status in serialRead()\n");#endif        break;    }  } else if (nread == 0)    ret_code = 0;               /* nothing to read */  else if (read_errno == ERRNO_FOR_BLOCKED_IO) /* nread < 0 */    ret_code = 0;#ifdef DEBUG  if ((nread<0) && (read_errno!=ERRNO_FOR_BLOCKED_IO))    perror("read() error in serialRead()");#endif  return ret_code;}static int SerialWrite(DriverCall *dc) {  int nwritten = 0;  te_status testatus = TS_IN_PKT;  if (dc->dc_context == NULL) {    Angel_TxEngineInit(&config, &(dc->dc_packet), &(wstate.txstate));    wstate.wbindex = 0;    dc->dc_context = &wstate;  }  while ((testatus == TS_IN_PKT) && (wstate.wbindex < MAXWRITESIZE))  {    /* send the raw data through the tx engine to escape and encapsulate */    testatus = Angel_TxEngine(&(dc->dc_packet), &(wstate.txstate),                              &(wstate.writebuf)[wstate.wbindex]);    if (testatus != TS_IDLE) wstate.wbindex++;  }  if (testatus == TS_IDLE) {#ifdef DEBUG    printf("SerialWrite: testatus is TS_IDLE during preprocessing\n");#endif  }#ifdef DO_TRACE  {     int i = 0;    while (i<wstate.wbindex)    {        printf(">%02X ",wstate.writebuf[i]);        if (!(++i % 16))            printf("\n");    }    if (i % 16)        printf("\n");  }#endif#ifdef COMPILING_ON_WINDOWS  if (WriteSerial(wstate.writebuf, wstate.wbindex) == COM_OK)  {    nwritten = wstate.wbindex;    if (pfnProgressCallback != NULL)    {      progressInfo.nWritten += nwritten;      (*pfnProgressCallback)(&progressInfo);    }  }  else  {      MessageBox(GetFocus(), "Write error\n", "Angel", MB_OK | MB_ICONSTOP);      return -1;   /* SJ - This really needs to return a value, which is picked up in */                   /*      DevSW_Read as meaning stop debugger but don't kill. */  }#else  nwritten = Unix_WriteSerial(wstate.writebuf, wstate.wbindex);  if (nwritten < 0) {    nwritten=0;  }#endif#ifdef DEBUG  if (nwritten > 0)    printf("Wrote %#04x bytes\n", nwritten);#endif  if ((unsigned) nwritten == wstate.wbindex &&       (testatus == TS_DONE_PKT || testatus == TS_IDLE)) {    /* finished sending the packet */#ifdef DEBUG    printf("SerialWrite: calling Angel_TxEngineInit after sending packet (len=%i)\n",wstate.wbindex);#endif    testatus = TS_IN_PKT;    wstate.wbindex = 0;    return 1;  }  else {#ifdef DEBUG    printf("SerialWrite: Wrote part of packet wbindex=%i, nwritten=%i\n",           wstate.wbindex, nwritten);#endif       /*     *  still some data left to send shuffle whats left down and reset     * the ptr     */    memmove((char *) wstate.writebuf, (char *) (wstate.writebuf+nwritten),            wstate.wbindex-nwritten);    wstate.wbindex -= nwritten;    return 0;  }  return -1;}static int serial_reset( void ){#ifdef DEBUG    printf( "serial_reset\n" );#endif#ifdef COMPILING_ON_WINDOWS    FlushSerial();#else    Unix_ResetSerial();#endif    return serial_set_params( &serial_defaults );}static int find_baud_rate( unsigned int *speed ){    static struct {          unsigned int baud;          int termiosValue;    } possibleBaudRates[] = {#if defined(__hpux)        {115200,_B115200}, {57600,_B57600},#else#ifdef B115200        {115200,B115200},#endif#ifdef B57600	{57600,B57600},#endif#endif#ifdef COMPILING_ON_WINDOWS        {38400,CBR_38400}, {19200,CBR_19200}, {9600, CBR_9600}, {0,0}#else        {38400,B38400}, {19200,B19200}, {9600, B9600}, {0,0}#endif    };    unsigned int i;    /* look for lower or matching -- will always terminate at 0 end marker */    for ( i = 0; possibleBaudRates[i].baud > *speed; ++i )       /* do nothing */ ;    if ( possibleBaudRates[i].baud > 0 )       *speed = possibleBaudRates[i].baud;    return possibleBaudRates[i].termiosValue;}static int serial_set_params( const ParameterConfig *config ){    unsigned int speed;    int termios_value;#ifdef DEBUG    printf( "serial_set_params\n" );#endif    if ( ! Angel_FindParam( AP_BAUD_RATE, config, &speed ) )    {#ifdef DEBUG        printf( "speed not found in config\n" );#endif        return DE_OKAY;    }    termios_value = find_baud_rate( &speed );    if ( termios_value == 0 )    {#ifdef DEBUG        printf( "speed not valid: %u\n", speed );#endif        return DE_OKAY;    }#ifdef DEBUG    printf( "setting speed to %u\n", speed );#endif#ifdef COMPILING_ON_WINDOWS    SetBaudRate((WORD)termios_value);#else    Unix_SetSerialBaudRate(termios_value);#endif    return DE_OKAY;}static int serial_get_user_params( ParameterOptions **p_options ){#ifdef DEBUG    printf( "serial_get_user_params\n" );#endif    if ( user_options_set )    {        *p_options = &user_options;    }    else    {        *p_options = NULL;    }    return DE_OKAY;}static int serial_get_default_params( ParameterConfig **p_config ){#ifdef DEBUG    printf( "serial_get_default_params\n" );#endif    *p_config = (ParameterConfig *) &serial_defaults;    return DE_OKAY;}static int SerialIoctl(const int opcode, void *args) {    int ret_code;#ifdef DEBUG    printf( "SerialIoctl: op %d arg %p\n", opcode, args ? args : "<NULL>");#endif    switch (opcode)    {       case DC_RESET:                    ret_code = serial_reset();           break;       case DC_SET_PARAMS:                ret_code = serial_set_params((const ParameterConfig *)args);           break;       case DC_GET_USER_PARAMS:                ret_code = serial_get_user_params((ParameterOptions **)args);           break;       case DC_GET_DEFAULT_PARAMS:           ret_code = serial_get_default_params((ParameterConfig **)args);           break;       default:                          ret_code = DE_BAD_OP;           break;    }  return ret_code;}DeviceDescr angel_SerialDevice = {    "SERIAL",    SerialOpen,    SerialMatch,    SerialClose,    SerialRead,    SerialWrite,    SerialIoctl};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -