56 #include <readline/readline.h> 57 #include <readline/history.h> 58 #endif // HAVE_READLINE 60 #include "rnr/rnrconfig.h" 72 #define RC_QUIT (RC_ERROR-1) 105 .synopsis =
"I2C Simple Raw Shell",
107 "The I2C Shell (%P) provides a simple interactive interface to devices " 108 "attached to an I2C Bus." 118 .long_opt =
"device",
120 .has_arg = required_argument,
123 .fn_cvt = OptsCvtArgStr,
124 .fn_fmt = OptsFmtStr,
125 .arg_name =
"<device>",
126 .opt_desc =
"I2C device." 131 .long_opt =
"verbose",
133 .has_arg = no_argument,
136 .fn_fmt = OptsFmtBool,
137 .opt_desc =
"Set print verbosity." 161 if( (s == NULL) || (*s == 0) )
166 lVal = strtol(s, &sEnd, 0);
178 *pVal = (uint_t)lVal;
199 else if( uVal > 0xff )
205 *pByte = (byte_t)uVal;
218 static const char **
makeargs(
char *sLine,
int *pArgc)
220 static const char *args[256];
222 char *sDelim =
" \t\n\r";
225 for(s=strtok(sLine, sDelim); s!=NULL && i<256; s=strtok(NULL, sDelim))
233 #ifndef HAVE_READLINE 245 static char linebuf[512];
249 if( prompt && *prompt )
251 printf(
"%s", prompt);
254 if( fgets(linebuf, (
int)
sizeof(linebuf), stdin) == NULL )
259 linebuf[
sizeof(linebuf)-1] = 0;
262 for(s=linebuf; *s && bIsBlank; ++s)
279 #endif // HAVE_READLINE 307 printf(
"Error: %s requires 2 arguments\n", sArgv[0]);
311 LOGDIAG1CALL(_TPTR(pI2C), _TINT(nArgc), _TSTR(sArgv[0]), _TSTR(sArgv[1]),
317 printf(
"Error: %s: bad I2C address\n", sArgv[1]);
320 else if( addr > 0x7f )
322 printf(
"Error: 0x%02x: I2C address out of range [0,0x7f]\n", addr);
329 printf(
"Error: %s: bad read length\n", sArgv[2]);
332 else if( readlen >
sizeof(readbuf) )
334 printf(
"Error: %d: I2C read length out of range [0,%u]\n",
335 readlen, (uint_t)
sizeof(readbuf));
342 printf(
"command: %s\n", sArgv[0]);
343 printf(
" address: 0x%02x\n", addr);
344 printf(
" read length: %d\n", readlen);
347 rc =
i2c_read(pI2C, addr, readbuf, readlen);
350 LOGSYSERROR(
"i2c_read()");
356 printf(
"response:\n");
360 readlen = (uint_t)rc;
362 for(i=0; i<readlen; ++i)
364 printf(
"0x%02x ", readbuf[i]);
369 printf(
" bytes read: %u\n", readlen);
390 byte_t writebuf[256];
396 printf(
"Error: %s requires at least 2 arguments\n", sArgv[0]);
400 LOGDIAG1CALL(_TPTR(pI2C), _TINT(nArgc), _TSTR(sArgv[0]), _TSTR(sArgv[1]),
406 printf(
"Error: %s: bad I2C address\n", sArgv[1]);
409 else if( addr > 0x7f )
411 printf(
"Error: 0x%02x: I2C address out of range [0,0x7f]\n", addr);
416 for(i=2, j=0; i<nArgc && j<
sizeof(writebuf); ++i, ++j)
418 if(
StrToByte(sArgv[i], writebuf+j) != OK )
420 printf(
"Error: argv[%d]='%s': bad byte value\n", i, sArgv[i]);
424 writelen = (uint_t)j;
429 printf(
"command: %s\n", sArgv[0]);
430 printf(
" address: 0x%02x\n", addr);
431 printf(
" write length: %d\n", writelen);
433 for(i=0; i<writelen; ++i)
435 printf(
"0x%02x ", writebuf[i]);
440 rc =
i2c_write(pI2C, addr, writebuf, writelen);
444 LOGSYSERROR(
"i2c_write()");
450 printf(
"response:\n");
451 printf(
" bytes written: ");
453 printf(
"%d\n", writelen);
473 byte_t writebuf[256];
481 printf(
"Error: %s requires at least 3 arguments\n", sArgv[0]);
485 LOGDIAG1CALL(_TPTR(pI2C), _TINT(nArgc), _TSTR(sArgv[0]), _TSTR(sArgv[1]),
486 _TSTR(sArgv[2]), _TSTR(sArgv[3]));
491 printf(
"Error: %s: bad I2C address\n", sArgv[1]);
494 else if( addr > 0x7f )
496 printf(
"Error: 0x%02x: I2C address out of range [0,0x7f]\n", addr);
501 for(i=2, j=0; i<nArgc-1 && j<
sizeof(writebuf); ++i, ++j)
503 if(
StrToByte(sArgv[i], writebuf+j) != OK )
505 printf(
"Error: argv[%d]='%s': bad byte value\n", i, sArgv[i]);
509 writelen = (uint_t)j;
514 printf(
"Error: %s: bad read length\n", sArgv[nArgc-1]);
517 else if( readlen >
sizeof(readbuf) )
519 printf(
"Error: %d: I2C read length out of range [0,%u]\n",
520 readlen, (uint_t)
sizeof(readbuf));
527 printf(
"command: %s\n", sArgv[0]);
528 printf(
" address: 0x%02x\n", addr);
529 printf(
" write length: %d\n", writelen);
531 for(i=0; i<writelen; ++i)
533 printf(
"0x%02x ", writebuf[i]);
536 printf(
" read length: %d\n", readlen);
539 rc =
i2c_transfer(pI2C, addr, writebuf, writelen, readbuf, readlen);
543 LOGSYSERROR(
"i2c_transfer()");
549 printf(
"response:\n");
552 for(i=0; i<readlen; ++i)
554 printf(
"0x%02x ", readbuf[i]);
572 printf(
"0x%02x ", addr);
593 printf(
"Error: %s takes no arguments\n", sArgv[0]);
597 LOGDIAG1CALL(_TPTR(pI2C), _TINT(nArgc), _TSTR(sArgv[0]));
601 printf(
"command: %s\n", sArgv[0]);
602 printf(
"response:\n");
603 printf(
" scanned devices: ");
610 printf(
" number found: %d\n", n);
634 printf(
"Error: %s requires 1 argument\n", sArgv[0]);
638 LOGDIAG1CALL(_TPTR(pI2C), _TINT(nArgc), _TSTR(sArgv[0]), _TSTR(sArgv[1]));
643 printf(
"Error: %s: bad I2C address\n", sArgv[1]);
646 else if( addr > 0x7f )
648 printf(
"Error: 0x%02x: I2C address out of range [0,0x7f]\n", addr);
654 printf(
"command: %s\n", sArgv[0]);
659 LOGSYSERROR(
"i2c_exists()");
665 printf(
"response:\n");
666 printf(
" 0x%02X", addr);
671 printf(
"device found\n");
675 printf(
"device not found\n");
696 printf(
"Error: %s requires 1 argument\n", sArgv[0]);
700 if( !strcmp(sArgv[1],
"on") )
706 else if( !strcmp(sArgv[1],
"off") )
714 printf(
"Error: %s: unknown option\n", sArgv[1]);
736 for(pCmd=I2CCmds; pCmd->
m_sCmd!=NULL; pCmd++)
772 "<addr> <readlength>" 778 "<addr> <wbyte0> [<wbyte1> ...]" 783 "I2C write/read transaction",
784 "<addr> <wbyte0> [<wbyte1> ...] <readlength>" 789 "check if device exists on I2C Bus",
795 "scan I2C Bus for all connected devices",
835 Argv0 = basename(argv[0]);
856 LOGSYSERROR(
"%s: Failed to open.",
OptDevName);
897 for(pCmd=I2CCmds, bDidCmd=0; pCmd->
m_sCmd!=NULL && !bDidCmd; pCmd++)
899 if( !strncmp(sArgv[0], pCmd->
m_sCmd, strlen(sArgv[0])) )
902 rc = pCmd->
m_fnExec(pI2C, nArgc, sArgv);
913 printf(
"Error: Unknown command: %s\n", sArgv[0]);
917 #endif // HAVE_READLINE 929 int main(
int argc,
char *argv[])
935 printf(
"I2C Raw Shell\n");
936 printf(
"-------------\n");
937 printf(
"(partial command matching valid; enter 'help' for help)\n\n");
int i2c_write(i2c_t *i2c, i2c_addr_t addr, const byte_t *buf, uint_t len)
Write to an I2C device.
static int execCheck(i2c_t *pI2C, int nArgc, const char *sArgv[])
Execute I2C slave device check.
static OptsPgmInfo_T I2CShPgmInfo
Program Information.
static const char ** makeargs(char *sLine, int *pArgc)
Make array of arguments separated with white-space.
ushort_t i2c_addr_t
I2C Device Address Type.
void i2c_close(i2c_t *i2c)
Closes an I2C Bus.
static char * OptDevName
i2c bus device option
static char * readline(const char *prompt)
Read an input line from stdin.
static int StrToByte(const char *s, byte_t *pByte)
Convert string to byte.
int( execfunc_t)(i2c_t *, int, const char *[])
Command execution function type.
int i2c_scan(i2c_t *i2c, int(*callback)(i2c_t *i2c, i2c_addr_t addr, void *context), void *context)
Scans the given I2C Bus to find all connected devices.
static int execWrite(i2c_t *pI2C, int nArgc, const char *sArgv[])
Execute I2C slave device write.
static int execVerbose(i2c_t *pI2C, int nArgc, const char *sArgv[])
Execute enabling/disabling verbose printing.
static int OptVerbose
verbose option
const char * m_sHelpArgs
command help argments
static OptsInfo_T I2CShOptsInfo[]
Command Line Options Information.
static void MainLoop(i2c_t *pI2C)
Shell main loop.
int i2c_transfer(i2c_t *i2c, i2c_addr_t addr, const byte_t *write_buf, uint_t write_len, byte_t *read_buf, uint_t read_len)
Perform a transfer with an I2C device.
static const PkgInfo_T PkgInfo
static void MainInit(int argc, char *argv[], i2c_t *pI2C)
Command initialization.
static int execRead(i2c_t *pI2C, int nArgc, const char *sArgv[])
Execute I2C slave device read.
const char * m_sCmd
input-line full command name
execfunc_t * m_fnExec
assoc. exec. function
Package version information.
static int execTransaction(i2c_t *pI2C, int nArgc, const char *sArgv[])
Execute I2C slave device write/read transaction.
static int execQuit(i2c_t *pI2C, int nArgc, const char *sArgv[])
Execute quit shell.
int i2c_open(i2c_t *i2c, const char *device)
Open the host I2C Bus device.
int main(int argc, char *argv[])
i2csh main()
int i2c_read(i2c_t *i2c, i2c_addr_t addr, byte_t *buf, uint_t len)
Read from an I2C device.
static int execScan(i2c_t *pI2C, int nArgc, const char *sArgv[])
Execute I2C slave device scan.
static shcmd_t I2CCmds[]
forward declaration of shell commands
#define RC_QUIT
quit shell return code
static int StrToUnsigned(const char *s, uint_t *pVal)
Convert string to unsigned integer.
const char * m_sHelpBrief
command help
int i2c_exists(i2c_t *i2c, i2c_addr_t addr)
Test the existance of a device at the given address on the given I2C Bus.
static int scanCallback(i2c_t *pI2C, i2c_addr_t addr, void *context)
Found scanned device callback.
static char * Argv0
command name
Low-level I2C communication level.
static int execHelp(i2c_t *pI2C, int nArgc, const char *sArgv[])
Execute shell help.