MySmartUSB-MK3-Interface

MySmartUSB MK3 Interface
git clone git://xatko.vsos.ethz.ch/MySmartUSB-MK3-Interface.git
Log | Files | Refs

commit d79e2ec5ec3ac7e3216ed7606337881bc4b91b4f
parent 333394dd1ba87d2efcbb7b41e608d7ad5b118b26
Author: Dominik Schmidt <das1993@hotmail.com>
Date:   Thu, 13 Dec 2012 22:59:58 +0100

Problem of Baudswitching solved by unclean waittime...

Diffstat:
ctrl.c | 12++++++++----
include/dev.h | 1+
include/engine.h | 1+
src/cmd.c | 6++----
src/cmd_dispatch.c | 13+++++++++----
src/dev.c | 12++++++++----
src/engine.c | 35+++++++++++++++++++++++++++++------
7 files changed, 58 insertions(+), 22 deletions(-)

diff --git a/ctrl.c b/ctrl.c @@ -3,7 +3,7 @@ * * @copyright: Copyright (c) 2012, Dominik Schmidt * @author: Dominik Schmidt <das1993@hotmail.com> - * @version: 0.0.0 + * @version: 0.0.0 * @license: CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/) * */ @@ -12,8 +12,12 @@ #include <com.h> #include <unistd.h> int main(int argc, char **argv){ - engine_init(argc,argv); - engine_run(); - engine_deinit(); + return engine_autorun(argc,argv); + /* + int fd=openDevice("/dev/ttyUSB0"); + sendMagicPacket(fd,'m'); + readMagicPacket(fd); + closeDevice(fd); + */ return 0; } diff --git a/include/dev.h b/include/dev.h @@ -13,6 +13,7 @@ extern int closeDevice(int dev); extern int autoConfigBaud(int fd); extern int openDevice(char *dev); extern int setBaudRate(int fd, speed_t baud, unsigned int baud_select); +extern int setBaudRateExt(int fd, speed_t baud, unsigned int baud_select, int extra); enum BAUD_SELECT{ BAUD_INPUT=(1<<0), BAUD_OUTPUT=(1<<1) diff --git a/include/engine.h b/include/engine.h @@ -13,3 +13,4 @@ extern void print_usage(FILE *stream); extern int engine_init(int argc, char **argv); extern int engine_run(void); extern int engine_deinit(void); +extern int engine_autorun(int argc, char **argv); diff --git a/src/cmd.c b/src/cmd.c @@ -137,15 +137,13 @@ GENERATE_CALLBACK(cmd_set_emul_mode){ char str[50]; sprintf(str,"Setting mode to %c",mode); do_log("cmd_set_emul_mode",str,LOG_LEVEL_DEBUG,LOG_TYPE_NORMAL); - if(newBaud!=0){ - setBaudRate(fd,newBaud,BAUD_INPUT); - } if(sendMagicPacket(fd,mode)<0){ do_log("cmd_set_emul_mode","Couldn't send magic packet",LOG_LEVEL_ERROR,LOG_TYPE_NORMAL); return -2; } if(newBaud!=0){ - setBaudRate(fd,newBaud,BAUD_OUTPUT); + usleep(5000); + setBaudRateExt(fd,newBaud,BAUD_INPUT|BAUD_OUTPUT, TCSADRAIN); } if(readMagicPacket(fd)!=mode){ do_log("cmd_set_emul_mode","Couldn't set Mode",LOG_LEVEL_ERROR,LOG_TYPE_NORMAL); diff --git a/src/cmd_dispatch.c b/src/cmd_dispatch.c @@ -11,12 +11,13 @@ #include <cmd_dispatch.h> #include <cmd.h> #include <stdlib.h> -#include <stdio.h> #include <option.h> #include <termios.h> #include <string.h> #include <com.h> #include <dev.h> +#include <stdio.h> +#include <unistd.h> struct command_def commands[]={ {.name="Status", .opt={.arg_length=0, .short_option="-s", .long_option="--status"}, .request_mymode=0, .callback=&cmd_status}, {.name="Reset", .opt={.arg_length=0, .short_option="-R", .long_option="--reset"}, .request_mymode=1, .callback=&cmd_reset}, @@ -83,12 +84,16 @@ int prepareCommandExecution(int fd, struct conf *config){ sendMagicPacket(fd,'i'); config->oldmode=readMagicPacket(fd); if(config->oldmode!='m'){ + fsync(fd); sendMagicPacket(fd,'m'); - setBaudRate(fd,B500000, BAUD_INPUT|BAUD_OUTPUT); - if(readMagicPacket(fd)!='m'){ + usleep(5000); + setBaudRateExt(fd,B500000, BAUD_INPUT|BAUD_OUTPUT, TCSADRAIN); + char c=readMagicPacket(fd); + if(c!='m'){ do_log("prepareCommandExecution","Couldn't switch to mymode",LOG_LEVEL_ERROR,LOG_TYPE_NORMAL); return -1; } + setBaudRate(fd,B500000, BAUD_INPUT|BAUD_OUTPUT); } } @@ -96,7 +101,7 @@ int prepareCommandExecution(int fd, struct conf *config){ } int finishCommandExecution(int fd, struct conf *config){ if(config->oldmode>0){ - sendMagicPacket(fd,config->oldmode); + sendMagicPacket(fd,config->oldmode); } return 0; } diff --git a/src/dev.c b/src/dev.c @@ -27,9 +27,10 @@ int autoConfigBaud(int fd){ unsigned int i=0; char str[50]; do_log("autoConfigBaud","Testing preset Baud",LOG_LEVEL_DEBUG,LOG_TYPE_NORMAL); + char c; for(i=0;i<=3; i++){ sendMagicPacket(fd,'i'); - char c=readMagicPacket(fd); + c=readMagicPacket(fd); if(c!=0){ break; } @@ -46,10 +47,13 @@ int autoConfigBaud(int fd){ do_log("autoConfigBaud",str,LOG_LEVEL_DEBUG,LOG_TYPE_NORMAL); } do_log("autoConfigBaud","BaudRate autoconfiguration successfull",LOG_LEVEL_DEBUG,LOG_TYPE_NORMAL); - + fsync(fd); return 0; } int setBaudRate(int fd, speed_t baud, unsigned int baud_select){ + return setBaudRateExt(fd, baud, baud_select, TCSANOW); +} +int setBaudRateExt(int fd, speed_t baud, unsigned int baud_select, int extra){ struct termios options; char str[50]; if(tcgetattr(fd, &options)<0){ @@ -78,7 +82,7 @@ int setBaudRate(int fd, speed_t baud, unsigned int baud_select){ do_log("setBaudRate", str, LOG_LEVEL_DEBUG, LOG_TYPE_NORMAL); } } - if(tcsetattr(fd, TCSANOW, &options)<0){ + if(tcsetattr(fd, extra, &options)<0){ do_log("setBaudRate","Couldn't set Options",LOG_LEVEL_ERROR,LOG_TYPE_SIGNAL); closeDevice(fd); return -4; @@ -92,7 +96,7 @@ int openDevice(char *dev){ do_log("openDevice", "Couldn't open Device", LOG_LEVEL_FATAL,LOG_TYPE_SIGNAL); return -1; } - ioctl(fd, TIOCEXCL); + //ioctl(fd, TIOCEXCL); struct termios options; tcgetattr(fd, &options); diff --git a/src/engine.c b/src/engine.c @@ -12,7 +12,7 @@ #include <cmd_dispatch.h> #include <dev.h> #include <log.h> - +#include <engine.h> void print_usage(FILE *stream){ fprintf(stream,"Usage of %s\n",configuration.filename); fprintf(stream,"Global Commands:\n"); @@ -33,10 +33,29 @@ void print_usage(FILE *stream){ } - +int engine_autorun(int argc, char **argv){ + int ret=engine_init(argc,argv); + if(ret<-1){ + do_log("engine_autorun", "Couldn't initialize engine",LOG_LEVEL_FATAL, LOG_TYPE_NORMAL); + return -1; + } + if(ret>-1&&engine_run()<0){ + do_log("engine_autorun", "Couldn't run the command",LOG_LEVEL_FATAL, LOG_TYPE_NORMAL); + return -3; + } + return engine_deinit(); +} int engine_init(int argc, char **argv){ configuration.filename=argv[0]; - parseArguments(argc-1, &argv[1],&configuration); + if(argc<=1){ + configuration.print_usage=1; + return -1; + } + + if(parseArguments(argc-1, &argv[1],&configuration)<0){ + do_log("engine_init", "Couldn't parse Arguments",LOG_LEVEL_FATAL, LOG_TYPE_NORMAL); + return -2; + } return 0; @@ -45,10 +64,14 @@ int engine_init(int argc, char **argv){ int engine_run(void){ int fd=openDevice(configuration.device); if(fd<0){ - do_log("main","Couldn't open device",LOG_LEVEL_FATAL,LOG_TYPE_NORMAL); - return 1; + do_log("engine_run","Couldn't open device",LOG_LEVEL_FATAL,LOG_TYPE_NORMAL); + return -1; + } + if(prepareCommandExecution(fd, &configuration)<0){ + do_log("engine_run", "CommandExecution Preparation failed", LOG_LEVEL_FATAL, LOG_TYPE_NORMAL); + closeDevice(fd); + return -2; } - prepareCommandExecution(fd, &configuration); processCommands(configuration.cmdlist.data,fd); finishCommandExecution(fd, &configuration); closeDevice(fd);