Hallo,
ich hatte bis gestern einige Probleme mit meinem 1-wire Bus.
Ich habe kein WG, sondern einen Clone, bzw. nutze sh.py für die Brücke KNX/1wire.
Da ich meine Komponenten aber alle von ElabNet habe und/oder aus Freundlichkeit hat Stefan und zuvor auch mal Makki mir im WG-Forum geholfen, wobei eine Frage war, welches Patchlevel ich verwende.
Dem bin ich jetzt mal (endlich) nachgegangen. Ein PL gibt es für mich natürlich nicht, aber hier ist es dann ja u.a. die owfs-Version.
Ich habe also die Version aus dem wg-Forum genommen und für 64bit Ubuntu gebaut.
Seitdem ist der Bus seit 48h stabil, d.h. ohne Restarts. Das ist neu für mich.
Deshalb hab ich jetzt mal die Version, die auf dem WG genutzt wird mit der entsprechenden Original-Version (2.8p14) verglichen.
In dem Source Paket aus dem WG-Repo sind viele Dateien mehr drin, als in der Original-Version, viele *.o, weshalb ich davon ausgehe, dass die Dateien dadurch in das Paket geraten sind, dass vor dem Packen einmal kompiliert wurde.
Daher habe ich jetzt mal nur die Dateien verglichen, die in beiden Versionen enthalten sind.
Hier möchte ich die Unterschiede zeigen:
1) Einige Pfade in Makefiles sind angepasst. Ich gehe davon aus, dass keinen Einfluss auf die Stabilität hat.
2) unter examples\ sind einige *.php Dateien unterschiedlich. Ich gehe davon aus, dass keinen Einfluss auf die Stabilität hat.
3) Interessant wird es in module\owlib\src\c\
Da gibt es die ow_ds9490.c und die ow_usb_msg.c
Hierin gibt es einige Änderungen von Makki.
Wer Probleme mit der Stabilität seines 1w-Bus hat, kann ja diese Patches mal ausprobieren.
Anbei auch die kompilierten Pakete für ubuntu 64 bit.
Ach so: Bitte keinen Flame-War jetzt.
Gruß,
Hendrik
ich hatte bis gestern einige Probleme mit meinem 1-wire Bus.
Ich habe kein WG, sondern einen Clone, bzw. nutze sh.py für die Brücke KNX/1wire.
Da ich meine Komponenten aber alle von ElabNet habe und/oder aus Freundlichkeit hat Stefan und zuvor auch mal Makki mir im WG-Forum geholfen, wobei eine Frage war, welches Patchlevel ich verwende.
Dem bin ich jetzt mal (endlich) nachgegangen. Ein PL gibt es für mich natürlich nicht, aber hier ist es dann ja u.a. die owfs-Version.
Ich habe also die Version aus dem wg-Forum genommen und für 64bit Ubuntu gebaut.
Seitdem ist der Bus seit 48h stabil, d.h. ohne Restarts. Das ist neu für mich.
Deshalb hab ich jetzt mal die Version, die auf dem WG genutzt wird mit der entsprechenden Original-Version (2.8p14) verglichen.
In dem Source Paket aus dem WG-Repo sind viele Dateien mehr drin, als in der Original-Version, viele *.o, weshalb ich davon ausgehe, dass die Dateien dadurch in das Paket geraten sind, dass vor dem Packen einmal kompiliert wurde.
Daher habe ich jetzt mal nur die Dateien verglichen, die in beiden Versionen enthalten sind.
Hier möchte ich die Unterschiede zeigen:
1) Einige Pfade in Makefiles sind angepasst. Ich gehe davon aus, dass keinen Einfluss auf die Stabilität hat.
2) unter examples\ sind einige *.php Dateien unterschiedlich. Ich gehe davon aus, dass keinen Einfluss auf die Stabilität hat.
3) Interessant wird es in module\owlib\src\c\
Da gibt es die ow_ds9490.c und die ow_usb_msg.c
Hierin gibt es einige Änderungen von Makki.
Code:
diff ./ow_ds9490.c ~/owfs/wg_version/owfs-2.8p14/module/owlib/src/c/ow_ds9490.c 508a509,511 > LEVEL_DEBUG("DS9490 RESET. changed %d, flex: %d", in->changed_bus_settings, in->flex) ; > //in->changed_bus_settings=1; //FIXME: MM!!!! quirk this should be done completely in ow_usb_msg! > 510c513 < LEVEL_DEBUG("Attempting RESET on null bus") ; --- > LEVEL_DEBUG("Attempting RESET on null bus %d/%d", in->master.usb.usb, in->master.usb.dev) ; //FIXME! what doees it mean? no reconnect is tried->null the bus? 533c536,538 < if ( BAD( USB_Control_Msg(COMM_CMD, COMM_1_WIRE_RESET | COMM_F | COMM_IM | COMM_SE, USpeed, pn)) ) { --- > //FIXME: MM/ changed hard to flexible speed > //if ( BAD( USB_Control_Msg(COMM_CMD, COMM_1_WIRE_RESET | COMM_F | COMM_IM | COMM_SE, USpeed, pn)) ) { > if ( BAD( USB_Control_Msg(COMM_CMD, COMM_1_WIRE_RESET | COMM_F | COMM_IM | COMM_SE, ONEWIREBUSSPEED_FLEXIBLE, pn)) ) { 547a553 > LEVEL_DEBUG("DS9490_Reset: SHORT"); 549a556 > LEVEL_DEBUG("DS9490_Reset: OK"); 552a560,580 > LEVEL_DEBUG("DS9490_Reset: ERROR"); > /* FIXME: FIXED. In ow_usb_msg.c an USB-reset was was issued: > * USB_Control_Msg(CONTROL_CMD, CTL_RESET_DEVICE, 0x0000, pn) ; > * So we need to setup the Adapter again > * Though here is probably the wrong place, duplicated code from _setup_adaptor > */ > > // enable both program and strong pulses > if ( BAD( USB_Control_Msg(MODE_CMD, MOD_PULSE_EN, ENABLE_PROGRAM_AND_PULSE, pn)) ) { > LEVEL_DATA("EnableProgram error"); > } > // enable speed changes > if ( BAD( USB_Control_Msg(MODE_CMD, MOD_SPEED_CHANGE_EN, 1, pn)) ) { > LEVEL_DATA("RESET_Error: SpeedEnable error"); > } > // set the strong pullup duration to infinite > if ( BAD( USB_Control_Msg(COMM_CMD, COMM_SET_DURATION | COMM_IM, 0x0000, pn)) ) { //FIXME: changed from 0x0000 to 0x40 which is 1024ms to avoid timeout&reset_error > LEVEL_DATA("StrongPullup error"); > return gbBAD; > } > DS9490_SetSpeed(pn); 559c587 < LEVEL_DEBUG("Status bytes[%d]: %X", i, val); --- > LEVEL_DEBUG("Reset: Status bytes[%d]: %X", i, val); 817c845 < LEVEL_DATA("start"); --- > LEVEL_DATA("DS9490_PowerByte start"); 828a857 > LEVEL_DEBUG("DS9490_PowerByte DELAY:%d", delay); //FIXME: MM send 830a860 > //DS9490_HaltPulse(pn); //FIXME: MM send twice 889c919 < LEVEL_DATA("timeout"); --- > LEVEL_DATA("DS9490_HaltPulse timeout"); 999c1029 < if ( BAD( USB_Control_Msg(COMM_CMD, COMM_SET_DURATION | COMM_IM, 0x0000, pn)) ) { --- > if ( BAD( USB_Control_Msg(COMM_CMD, COMM_SET_DURATION | COMM_IM, 0x0000, pn)) ) { //FIXME: changed from 0x0000 to 0x40 which is 1024ms to avoid timeout&reset_error 1039c1069 < in->master.usb.pulldownslewrate = PARMSET_Slew0p83Vus; --- > in->master.usb.pulldownslewrate = PARMSET_Slew1p10Vus; //FIXME: was: PARMSET_Slew0p83Vus DS recommends PARMSET_Slew1p10Vus (0x4)??
Code:
diff ./ow_usb_msg.c ~/owfs/wg_version/owfs-2.8p14/module/owlib/src/c/ow_usb_msg.c 198a199,238 > //FIXME: if the line below really works we dont nee the line above ;) > LEVEL_DEBUG("USB status registers EFlags:%u->SPU:%u Dspeed:%u,Speed:%u,SPUdur:%u, PDslew:%u, W1lowtime:%u, W0rectime:%u, DevState:%u, CC1:%u, CC2:%u, CCState:%u, DataOutState:%u, DataInState:%u", > buffer[0], (buffer[0]&0x01), (buffer[0]&0x04 ? 1 : 0), > buffer[1], > buffer[2], > buffer[4], > buffer[5], > buffer[6], > buffer[8], > buffer[9], > buffer[10], > buffer[11], > buffer[12], > buffer[13] ); > /* > Datasheet DS2490 page 29 table 16 > 0: Enable Flags: SPUE=1(bit0) If set to 1, the strong pullup to 5V is enabled, if set to 0, it is disabled. > bit1 should be 0 but is 1 ?! SPCE = 4(bit2) If set to 1, a dynamic 1-Wire bus speed change through a Communication command is enabled, if set to 0, it is disabled. > 1: 1-Wire Speed > 2: Strong Pullup Duration > 3: (Reserved) > 4: Pulldown Slew Rate > 5: Write-1 Low Time > 6: Data Sample Offset / Write-0 Recovery Time > 7: reserved > 8: Device Status Flags: bit0: SPUA if set to 1, the strong pullup to 5V is currently active, if set to 0, it is inactive. > bit3(8): PMOD if set to 1, the DS2490 is powered from USB and external sources, if set to 0, all DS2490 power is provided from USB. FIXME: expose this to clients to check! > bit4(16): HALT if set to 1, the DS2490 is currently halted, if set to 0, the device is not halted. > bit5(32): IDLE if set to 1, the DS2490 is currently idle, if set to 0, the device is not idle. > bit5(64): EPOF: Endpoint 0 FIFO status, see: If EP0F is set to 1, the Endpoint 0 FIFO was full when a new control transfer setup packet was > received. This is an error condition in that the setup packet received is discarded due to the full > condition. To recover from this state the USB host must send a CTL_RESET_DEVICE command; the > device will also recover with a power on reset cycle. Note that the DS2490 will accept and process a > CTL_RESET_DEVICE command if the EP0F = 1 state occurs. If EP0F = 0, no FIFO error condition exists. > 9: Communication Command, Byte 1 > 10: Communication Command, Byte 2 > 11: Communication Command Buffer Status > 12: 1-Wire Data Out Buffer Status > 13: 1-Wire Data In Buffer Status > */ 212a253,266 > //FIXME: if the line below really works we dont nee the line above ;) > LEVEL_DEBUG("USB status registers EFlags:%u->SPU:%u Dspeed:%u,Speed:%u,SPUdur:%u, PDslew:%u, W1lowtime:%u, W0rectime:%u, DevState:%u, CC1:%u, CC2:%u, CCState:%u, DataOutState:%u, DataInState:%u", > buffer[0], (buffer[0]&0x01), (buffer[0]&0x04 ? 1 : 0), > buffer[1], > buffer[2], > buffer[4], > buffer[5], > buffer[6], > buffer[8], > buffer[9], > buffer[10], > buffer[11], > buffer[12], > buffer[13] ); 216c270 < if (++loops > 100) { --- > if (++loops > 100) { //FIXME: mm changed 100->200 220a275,277 > //FIXME: really! we must setup the adapter settings and speed! > //if ( BAD( DS9490_setup_adapter(in)) ) > //DS9490_SetSpeed(pn);
Anbei auch die kompilierten Pakete für ubuntu 64 bit.
Ach so: Bitte keinen Flame-War jetzt.
Gruß,
Hendrik
Kommentar