00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00048 #include <dev/board.h>
00049
00050 #include <sys/heap.h>
00051 #include <sys/thread.h>
00052 #include <sys/timer.h>
00053 #include <sys/version.h>
00054
00055 #include <stdlib.h>
00056 #include <stdio.h>
00057 #include <string.h>
00058 #include <io.h>
00059 #include <fcntl.h>
00060
00061 #define HHOPENVERSION "1.0.0"
00062
00063 #define BUFFERSIZE 128
00064
00065 #define DEV_DXM DEV_UART0
00066 #define DEV_DXM_NAME DEV_UART0_NAME
00067 #define DEV_DXM_SPEED_LOW 9600
00068 #define DEV_DXM_SPEED 250000
00069
00070 #define DEV_USB DEV_UART1
00071 #define DEV_USB_NAME DEV_UART1_NAME
00072 #define DEV_USB_SPEED 125000
00073
00074 typedef struct {
00075 FILE * devusb;
00076 FILE * devdxm;
00077 char connected;
00078 } CHANNEL_t;
00079
00080 const char str_start[] PROGMEM = "starting %S";
00081 const char str_fail[] PROGMEM = "FAIL\r\n";
00082 const char str_ok[] PROGMEM = "OK\r\n";
00083
00084
00085
00086
00087 void StreamCopy(FILE * ostream, FILE * istream, char *cop)
00088 {
00089 int cnt;
00090 char *buff;
00091
00092 buff = malloc(BUFFERSIZE);
00093 while (*cop) {
00094 if ((cnt = fread(buff, 1, BUFFERSIZE, istream)) <= 0)
00095 break;
00096 if (*cop && (cnt = fwrite(buff, 1, cnt, ostream)) <= 0)
00097 break;
00098 if (*cop && fflush(ostream))
00099 break;
00100 }
00101 *cop = 0;
00102 free(buff);
00103 }
00104
00105
00106
00107
00108 THREAD(dxm2usb, arg)
00109 {
00110 CHANNEL_t *cdp = arg;
00111
00112
00113
00114
00115
00116 for(;;)
00117 {
00118 if( cdp->connected) {
00119 NutThreadSetPriority(64);
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 StreamCopy(cdp->devusb, cdp->devdxm, &cdp->connected);
00130 NutThreadSetPriority(128);
00131 }
00132 NutThreadYield();
00133 }
00134 }
00135
00136
00137
00138
00139 THREAD(usb2dxm, arg)
00140 {
00141 CHANNEL_t *cdp = arg;
00142
00143
00144
00145
00146
00147 for(;;)
00148 {
00149 if( cdp->connected) {
00150 NutThreadSetPriority(64);
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 StreamCopy(cdp->devdxm, cdp->devusb, &cdp->connected);
00165 NutThreadSetPriority(128);
00166 }
00167 NutThreadYield();
00168 }
00169 }
00170
00171
00172
00173
00174
00175
00176 THREAD(ALife, arg)
00177 {
00178 NutThreadSetPriority(64);
00179 for(;;) {
00180 PORTF ^= (1<<PF7);
00181 NutSleep( 500);
00182 }
00183 }
00184
00185
00186
00187
00188
00189 #define HHBACKL_PORT PORTB
00190 #define HHBACKL_DDR DDRB
00191 #define HHBACKL_RED (1<<PB6)
00192 #define HHBACKL_GREEN (1<<PB5)
00193 #define HHBACKL_BLUE (1<<PB7)
00194
00195 #define HHDXM_PORT PORTE
00196 #define HHDXM_DDR DDRE
00197 #define HHDXM_RESET (1<<PE7)
00198 #define hhdxm_reset_h() HHDXM_PORT |= HHDXM_RESET
00199 #define hhdxm_reset_l() HHDXM_PORT &= ~HHDXM_RESET
00200 #define HHDXM_CTS (1<<PE3)
00201 #define HHDXM_RTS (1<<PE2)
00202 #define hhdxm_cts_ena() HHDXM_PORT &= ~HHDXM_CTS
00203 #define hhdxm_cts_dis() HHDXM_PORT |= HHDXM_CTS
00204 #define HHDXM_BOOT0 (1<<PE6)
00205 #define hhdxm_boot0_h() HHDXM_PORT |= HHDXM_BOOT0
00206 #define hhdxm_boot0_l() HHDXM_PORT &= ~HHDXM_BOOT0
00207
00208 void DXM_Reset( void)
00209 {
00210 hhdxm_reset_l();
00211 hhdxm_boot0_l();
00212 NutSleep( 200);
00213 hhdxm_reset_h();
00214 }
00215
00216 void DXM_Init( void)
00217 {
00218 HHDXM_DDR |= HHDXM_CTS|HHDXM_RESET|HHDXM_BOOT0;
00219 HHDXM_DDR &= ~HHDXM_RTS;
00220 hhdxm_boot0_h();
00221 hhdxm_reset_l();
00222 }
00223
00224 const char dxmstr_atz[] PROGMEM = "ATZ\r\n";
00225 const char dxmstr_dxm1[] PROGMEM = "DIAMEX";
00226 const char dxmstr_atsb[] PROGMEM = "ATSB6\r\n";
00227
00228 int DMX_Reconfigure( FILE * dev, FILE * debug)
00229 {
00230 char *buff;
00231 char trigger, l;
00232 uint32_t baud = 250000UL;
00233
00234 buff = malloc(BUFFERSIZE);
00235
00236
00237 fputs_P(dxmstr_atsb, dev);
00238 fflush( dev);
00239 while( fgetc(dev) != '6');
00240
00241 while( fgetc( dev) != '>');
00242
00243
00244
00245 fputs_P(dxmstr_atz, dev);
00246 fflush( dev);
00247 _ioctl( _fileno(dev), UART_SETSPEED, &baud);
00248
00249
00250 trigger = 1;
00251 do {
00252 fgets( buff, BUFFERSIZE, dev);
00253 fprintf_P( debug, PSTR("%s\r\n"), buff);
00254 l = strlen(buff);
00255 if( strncmp_P( buff, dxmstr_dxm1, l)==0) trigger = 0;
00256 } while( trigger);
00257 fputs(PSTR("250000\r\n"), debug);
00258
00259 free(buff);
00260 return 0;
00261 }
00262
00263
00264
00265
00266
00267 void Backlight_Init( void)
00268 {
00269
00270 HHBACKL_PORT |= HHBACKL_BLUE|HHBACKL_GREEN;
00271 }
00272
00273 void Backlight_Color( int r, int g, int b)
00274 {
00275 }
00276
00277
00278
00279
00280
00281
00282 int main(void)
00283 {
00284 CHANNEL_t cd;
00285 uint32_t baud = DEV_DXM_SPEED;
00286 uint32_t bufsz = BUFFERSIZE;
00287 char * buff = NULL;
00288 int state;
00289 #ifdef DEBUG_ISM
00290 int os = 0xff;
00291 #endif
00292
00293
00294 Backlight_Init();
00295
00296 DXM_Init();
00297
00298
00299
00300
00301 NutRegisterDevice(&DEV_USB, 0, 0);
00302 NutRegisterDevice(&DEV_DXM, 0, 0);
00303
00304
00305
00306
00307 cd.devusb = fopen(DEV_USB_NAME, "r+b");
00308 baud = DEV_USB_SPEED;
00309 _ioctl(_fileno(cd.devusb), UART_SETSPEED, &baud);
00310 _ioctl(_fileno(cd.devusb), UART_SETRXBUFSIZ, &bufsz);
00311 _ioctl(_fileno(cd.devusb), UART_SETTXBUFSIZ, &bufsz);
00312
00313 fprintf_P(cd.devusb, PSTR("\r\nNutO/S version %s"), NutVersionString());
00314 fputs_P( PSTR("\r\nHHopen DXM USB Bridge version "HHOPENVERSION"\r\n"), cd.devusb);
00315
00316
00317
00318
00319 baud = DEV_DXM_SPEED_LOW;
00320 cd.devdxm = fopen(DEV_DXM_NAME, "r+b");
00321 _ioctl(_fileno(cd.devdxm), UART_SETSPEED, &baud);
00322 _ioctl(_fileno(cd.devdxm), UART_SETRXBUFSIZ, &bufsz);
00323 _ioctl(_fileno(cd.devdxm), UART_SETTXBUFSIZ, &bufsz);
00324
00325
00326
00327
00328 NutThreadCreate("alife", ALife, NULL, 64);
00329
00330
00331
00332
00333 DXM_Reset();
00334 hhdxm_cts_ena();
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344 fputs_P( PSTR("start dxm2usb "), cd.devusb);
00345 if( NutThreadCreate("dxm2usb", dxm2usb, &cd, 128) == NULL)
00346 fputs_P( str_fail, cd.devusb);
00347 else
00348 fputs_P( str_ok, cd.devusb);
00349
00350
00351
00352
00353 fputs_P( PSTR("start dxm2usb "), cd.devusb);
00354 if( NutThreadCreate("usb2dxm", usb2dxm, &cd, 128) == NULL)
00355 fputs_P( str_fail, cd.devusb);
00356 else
00357 fputs_P( str_ok, cd.devusb);
00358
00359
00360
00361
00362 cd.connected = 0;
00363 state = 0;
00364 for (;;) {
00365 if( cd.connected == 0) {
00366
00367 #ifdef DEBUG_ISM
00368 if( os != state) {
00369 fprintf_P( cd.devusb, PSTR("ISM %d\r\n"), state);
00370 os = state;
00371 }
00372 #endif
00373 switch( state)
00374 {
00375 case 0:
00376 buff = malloc(BUFFERSIZE);
00377 state = 1;
00378 break;
00379 case 1:
00380 fgets( buff, BUFFERSIZE, cd.devdxm);
00381 fputs( buff, cd.devusb);
00382 if( strlen(buff)==0)
00383 break;
00384
00385 if( strncmp_P( buff, dxmstr_dxm1, strlen_P(dxmstr_dxm1))==0)
00386 state = 2;
00387 break;
00388 case 2:
00389 *buff = fgetc( cd.devdxm);
00390 fputc( *buff, cd.devusb);
00391 if( *buff == '>')
00392 state = 3;
00393 break;
00394 case 3:
00395 fputs_P( dxmstr_atsb, cd.devdxm);
00396 fflush(cd.devdxm);
00397 state = 4;
00398 break;
00399 case 4:
00400 *buff = fgetc( cd.devdxm);
00401 fputc( *buff, cd.devusb);
00402 if( *buff == '>')
00403 state = 5;
00404 break;
00405 case 5:
00406 fputs_P( dxmstr_atz, cd.devdxm);
00407 fflush(cd.devdxm);
00408 baud = DEV_DXM_SPEED;
00409 _ioctl( _fileno(cd.devdxm), UART_SETSPEED, &baud);
00410 state = 6;
00411 break;
00412 case 6:
00413 fgets( buff, BUFFERSIZE, cd.devdxm);
00414 fputs( buff, cd.devusb);
00415 if( strlen(buff)==0)
00416 break;
00417
00418 if( strncmp_P( buff, dxmstr_dxm1, strlen_P(dxmstr_dxm1))==0)
00419 state = 7;
00420 break;
00421 case 7:
00422 *buff = fgetc( cd.devdxm);
00423 fputc( *buff, cd.devusb);
00424 if( *buff == '>') {
00425 cd.connected = 1;
00426 free(buff);
00427 }
00428 break;
00429 default:
00430 fputs_P(PSTR("ERROR ISM\r\n"), cd.devusb);
00431 break;
00432 }
00433 NutSleep( 1);
00434 }
00435 else {
00436 NutSleep(1000);
00437 }
00438 }
00439 return 0;
00440 }