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

📄 io_merge.c

📁 TDK 6521 SOC 芯片 DEMO程序
💻 C
📖 第 1 页 / 共 3 页
字号:
             break;

          case 'O':            
             cmd_io ();              // 'O' User I(O) controls.
             break;

          case 'R':
             cmd_sfr ();              // 'R' Special Function (R)egisters.
             break;

          case 'S':                  // 'S' Serial controls.
             cmd_serial ();
             break;
       } 
    }     
    
    if (!cli_result)
       cli_result = OK_ID;

    cli_index = CLI_BASE;
    return (OK_ID == cli_result);
}

static void cmd_sfr (void)              // 'R' Special Function (R)egisters.
{
    U08 c;

    switch (toupper (get_char_d (&c)))
    {
       case 'I':
          cmd_sfr_xdata ();             // IO.
          break;

       default:
          cmd_sfr ();
          cli_index = c;                // Unget last character.
          break;
    }
}

static const U08 ri2default[] = {
//  0     1     2     3     4     5     6     7
    0,    1,    2,    3,    4,    5,    6,    7, // 2000-7.
    8,    9,   10,   11,   12,   13,   14,   15, // 2008-F. 
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2010-7.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2018-F. 
// 18 is 2022 in a 6513
   16,   17,   18,   -1,   -1,   -1,   -1,   -1, // 2020-7.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2028-F. 
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2030-7.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2038-F. 
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2040-7.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2048-F. 
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2050-7.
// 18 is 205A in a 6521
   -1,   -1,   18,   -1,   -1,   -1,   -1,   -1, // 2058-F. 
   19,   20,   21,   22,   -1,   -1,   -1,   -1, // 2060-8.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2068-F.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2070-7.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2078-F.
   23,   24,   -1,   -1,   -1,   -1,   -1,   -1, // 2080-7.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2088-F.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2090-7.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 2098-F.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 20A0-7.
   25,   26,   27,   -1,   -1,   -1,   -1,   -1, // 20A8-F.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 20B0-7.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 20B8-F.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 20C0-7.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 20C8-F.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 20D0-7.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 20D8-F.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 20E0-7.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 20E8-F.
   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, // 20F0-7.
   -1,   -1,   -1,   -1,   -1,   28,   29,   30  // 20F8-F.
};   

static void cmd_sfr_xdata (void)
{
    U08 c, p;
    U08 d;

    p = get_num ();                     // Get SFR's two-byte address.
    c = get_char_d (&d);                // Get action for SFR.

    do
    {
       if ('=' == c)
       {
          if (ri2default[ p ] == 0)
             Rom[ IO_DATA + ri2default[ p++ ]] = get_num () & 0xEF;   // Keep CE off.
          else
             Rom[ IO_DATA + ri2default[ p++ ]] = get_num ();       
       }
       else if ('+' == c)
       {
          if (ri2default[ p ]  == 0)
             Rom[ IO_DATA + ri2default[ p++ ]] |= get_num () & 0xEF;  // Keep CE off.
          else
             Rom[ IO_DATA + ri2default[ p++ ]] |= get_num ();       
       }
       else  // '-' == c  
       {
          Rom[ IO_DATA + ri2default[ p++ ]] &= ~get_num ();       
       }

       c = get_char_d (&d);
    } while (('+' == c) || ('-' == c) || ('=' == c));

    cli_index = d;                      // Unget last character.
}

static void cmd_ce_data_access (void)   // ']' CE data access.
{
    U32 n;
    U08 c, d;
    U32 p;
                                        
    c = get_num ();
    p = CE_DATA | (c << 2);             // Get data's four-byte address.  
    c = get_char_d (&d);                // Get action for address.

    while ('=' == c)
    {
       n = get_long ();       

       p += 4;
       Rom[ --p ] = (U08)(n % 0x100);   // Order from MSB to...
       n /= 0x100;
       Rom[ --p ] = (U08)(n % 0x100);   //
       n /= 0x100;
       Rom[ --p ] = (U08)(n % 0x100);   //
       n /= 0x100;
       Rom[ --p ] = (U08)(n % 0x100);   // ...LSB.
       p += 4;

       c = get_char_d (&d);
    }

    cli_index = d;                      // Unget last character.
}

typedef struct Parm 
{
    U08 p;
    S08 s; // negative indicates a signed value
} PARM;
#define cpMax 25
#define ipMax (cpMax - 1)
// from meter\meter.h, definition of struct Parameter_t
PARM const ap[cpMax]=
{
//    {(uint8x_t *) &IThrshld, sizeof(IThrshld)},
      {0,4},
//    {(uint8x_t *) &Config, sizeof(Config)},
      {4,1},
//    {(uint8x_t *) &VPThrshld, sizeof(VPThrshld)},
      {5,4},
//    {(uint8x_t *) &IPThrshld, sizeof(IPThrshld)},
      {9,4},
//    {(uint8x_t *) &Y_Cal_Deg0, -sizeof(Y_Cal_Deg0)},
      {13,-2},
//    {(uint8x_t *) &Y_Cal_Deg1, -sizeof(Y_Cal_Deg1)},
      {15,-2},
//    {(uint8x_t *) &Y_Cal_Deg2, -sizeof(Y_Cal_Deg2)},
      {17,-2},
//    {(uint8x_t *) &PulseWSource, sizeof(PulseWSource)},
      {19,1},
//    {(uint8x_t *) &PulseRSource, sizeof(PulseRSource)},
      {20,1},
//    {(uint8x_t *) &Vmax, -sizeof(Vmax)},
      {21,-2},
//    {(uint8x_t *) &Imax, -sizeof(Imax)},
      {23,-2},
//    {(uint8x_t *) &ppmc1, -sizeof(ppmc1)},
      {25,-2},
//    {(uint8x_t *) &ppmc2, -sizeof(ppmc2)},
      {27,-2},
//    {(uint8x_t *) &Pulse3Source, sizeof(Pulse3Source)},
      {29,1},
//    {(uint8x_t *) &Pulse4Source, sizeof(Pulse4Source)},
      {30,1},
//    {(uint8x_t *) &Scal, sizeof(Scal)},
      {31,2},
//    {(uint8x_t *) &Vcal, sizeof(Vcal)},
      {33,2},
//    {(uint8x_t *) &Ical, sizeof(Ical)},
      {35,2},
//    {(uint8x_t *) &VThrshld, sizeof(VThrshld)},
      {37,4},
//    {(uint8x_t *) &PulseWidth, sizeof(PulseWidth)},
      {41,2},
//    {(uint8x_t *) &temp_nom, sizeof(temp_nom)},
      {43,4},
//    {(uint8x_t *) &Imax2, -sizeof(Imax2)},
      {47,-2},
//    {(uint8x_t *) &IThrshld2, sizeof(IThrshld2)},
      {49,-4},
//    {(uint8x_t *) &VBatMin, sizeof(VBatMin)},
      {53,-4},
//    {(uint8x_t *) &CalibrationCount, sizeof(CalibrationCount)},
      {57,1}
};

// store a parameter
static void s (U16 ip, U32 v)
{
    U32 pT;

    if (ip > ipMax)
        return;

    switch (ap[ ip ].s)
    {
        case 0:
            break;
        default:
        case 1:
        case -1:
            pT = ap[ ip ].p + MPU_DATA;
            Rom[ pT ] = (U08)(v & 0xff);   // Order from MSB to...
            break;

        case 2:
        case -2:
            pT = 2 + ap[ ip ].p + MPU_DATA;
            Rom[ --pT ] = (U08)(v & 0xff);   // Order from LSB to...
            v /= 0x100;
            Rom[ --pT ] = (U08)(v & 0xff);   // MSB
            break;

        case 4:
        case -4:
            pT = 4 + ap[ ip ].p + MPU_DATA;
            Rom[ --pT ] = (U08)(v & 0xff);   // Order from LSB to...
            v /= 0x100;
            Rom[ --pT ] = (U08)(v & 0xff);   //
            v /= 0x100;
            Rom[ --pT ] = (U08)(v & 0xff);   //
            v /= 0x100;
            Rom[ --pT ] = (U08)(v & 0xff);   // MSB
            break;
    }
}
static void cmd_mpu_data_access (void)      // ')' MPU data access.
{
    U08 ip, c, d;
                                        
    ip = get_num ();

    c = get_char_d (&d);
    while ('=' == c && ip < ipMax)
    {
         s (ip++, get_long ());       
         c = get_char_d (&d);
    }

    cli_index = d;                          // Unget last character.
}

// Convert ascii decimal (or hex) short to binary number.
S16 get_short (void)              
{
    return ((S16) get_long ());
}

// Convert ascii decimal short to binary number.
S16 get_short_decimal (void)              
{
    return ((S16) get_long_decimal ('+'));
}

// Convert ascii hexdecimal short to binary number.
U16 get_short_hex (void)              
{
    return ((U16) get_long_hex ());
}

// Convert ascii decimal (or hex) number to binary number.
S08 get_num (void)              
{
    return ((S08) get_long ());
}

// Convert ascii decimal number to binary number.
S08 get_num_decimal (void)              
{
    return ((S08) get_long_decimal ('+'));
}

// Convert ascii hexdecimal byte to binary number.
U08 get_num_hex (void)
{
    return ((U08) get_long_hex ());
}

// Convert ascii decimal (or hex) long to binary number.
S32 get_long (void)              
{
    U08 c, d;

    c = get_char_d (&d);

    if ('+' == c || '-' == c)
       return (get_long_decimal (c));
    else
    {
       cli_index = d;                   // Unget last character.       
       return ((S32) get_long_hex ());  // Default to hexadecimal input.
    }
}

S32 get_long_decimal (U08 c)
{
    Bbool sign;
    U08 d, i;
    S32 n;

    i = 10;                             // Maximum number of digits allowed for decimal input.
    n = 0;                              // Number to be returned.

    sign = '-' == c;

    while (i > 0 && (c = get_digit (&d)) < 10)   
    {                                   // Convert ASCII decimal number to binary number.
       n = (n * 10) + c;
       i--;
    }

    if (i) cli_index = d;               // Unget last character, it wasn't a digit.

    if (sign)
       n = -n;

    return (n);
}

U32 get_long_hex (void)                 // Convert ASCII hexadecimal number to binary number.
{                             
    U08 c, d, i;
    U32 n;

    i = 8;                              // Maximum number of digits allowed for hex input.
    n = 0;                              // Number to be returned.
    while (i > 0 && (c = get_digit (&d)) < 0x10) 
    {                                   // Convert ASCII hexadecimal number to binary number.
       n = (n << 4) + c;
       i--;
    }

    if (i) cli_index = d;               // Unget last character, it wasn't a digit.
    return (n);
}

// Get next decimal (or hex) digit from CLI buffer.
U08 get_digit (U08 *d)                 
{
    U08 c;

    if (isxdigit (c = get_char_d (d)))
    {
       c -= '0';                        // '0' mapped to  0;

       if (c >= 10)
       {
          c &= ~CASE_;
          c -= 'A' - '0' - 10;          // 'A' mapped to 10.

⌨️ 快捷键说明

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