This document is a specification for the serial communications protocol of the ET312 Electrostimulation box by Erostek. The protocol was put together through multiple sources:
- Serial monitoring of box communications with various controls software
- Mapping from the original erosoutsider perl files
- Message board/Mailing list posts from around the internet
The following specifications are for v1.6 of the Erostek firmware, which it is assumed all modern boxes are running.
Communicating with the ET312 box happens via an RS-232 Connection to the Link port of the box. The link cable consists of a 3.5mm TRS (stereo audio) jack, going to some sort of computer connection, be it Female DB-9 or a RS232-to-USB converter. The pin connections are as follows:
- 3.5mm Tip <-> RX (DB-9 Pin 2)
- 3.5mm Ring <-> TX (DB-9 Pin 3)
- 3.5mm Sleeve <-> Ground (DB-9 Pin 5)
Serial connections are 19200/8/N/1, or:
- 19200 baud
- Data Bits: 8
- Stop Bits: 1
- Partity: None
Communication with the box is encrypted, using a simple XOR stream cipher based on keys exchanged during handshake.
Handshaking consists of a byte sent to the box, and a byte received back:
- 0x00 is sent to ET312
- 0x07 is read from ET312
This exchange only needs to happen once, but can be repeated.
After the HELLO ends, XOR keys must be exchanged. This involves sending a 3 byte sequence to the box, and receiving 3 bytes back:
- [0x2f, 0xVV, 0xWW] sent to ET312
- [0x21, 0xXX, 0xYY] is read from ET312
Where:
- 0xWW is a random unsigned 8-bit number, chosen by the host, used as the first key
- 0xXX is a random unsigned 8-bit number, chosen by the ET312, used as the second key
- 0xWW/0xYY is a checksum, the 8-bit unsigned sum of the first two bytes, wrapped if the sum is > 255.
For instance:
- [0x2f, 0x04, 0x33] is sent to ET312
- 0x04 is the first XOR key
- 0x33 is the checksum (0x2f + 0x04)
- [0x21, 0x8f, 0xb0] is read from ET312, meaning
- 0x8f is the XOR key
- 0xb0 is the checksum (0x21 + 0x8f)
Note that the key chosen by the host need never change, it can simply be hardcoded into the protocol implementation. Most implementations simply use 0 for the host key, which simplifies calculation.
Once the XOR keys are agreed upon, all further communication going from host to ET312 is required to be encoded using the following scheme, using ^ as an XOR operator:
Data Byte ^ (XOR Key 1 ^ XOR Key 2 ^ 0x55)
The part of the expression in parenthesis will be constant, and can be pre-calculated and stored.
Only data sent from host to ET312 requires encryption, all data received from the ET312 will be cleartext.
Outside of the initial key setup, talking to the ET312 happens through 2 functions. These resemble peek and poke, except that developers can send between 1-8 bytes at a time. Only 1 byte may be read at a time. Both functions take 16 bit addresses, which map into a virtual memory space set up by the communications handler on the ET312. This memory space looks like:
Address Range | Description |
---|---|
$0000 - $00ff | Flash (256b) |
$4000 - $43ff | Registers and Partial RAM (1k) |
$8000 - $81ff | EEPROM (512b) |
Reading past the end of these ranges will just loop the last valid range.
All further documentation will use these ranges as reference, so when we mention writing/reading to, say, $4010, this means we’re writing to byte 16 of the Register/RAM address space.
Also note that we do not have access to all of the RAM via this protocol. The CPU and IO registers take up the first 96 bytes of the address space we can access, and do not count as SRAM space. Since the virtual memory addressing cuts us off at $43ff, we cannot access the last 96 bytes of RAM. That said, the stack pointer never seems to move from 0x045f, which is gcc’s RAM end.
Reading a byte happens via a command with 3 byte length (minus checksum)
0x3c 0xGG 0xHH
- 0xHH - High byte of address
- 0xII - Low byte of address
Writing a byte happens via a command with 4 byte length (minus checksum)
0xGd 0xHH 0xII [0xJJ 0xKK…]
- 0xGd - High nibble is amount of data to write to address plus 0x3, low nibble is always 0x0d
- 0xHH - High byte of address
- 0xII - Low byte of address
- [0xJJ 0xKK]… - Value(s) to set address to
For instance, if we wanted to write 2 bytes, 0xFE 0xFF, starting 0x4010, the command would look like
0x5d 0x40 0x10 0xfe 0xff
- 0x5d is the write command with amount (0x3d + 0x20 since we’re writing 2 bytes)
- 0x40 0x10 is our 16-bit address (0x4010)
- 0xfe 0xff is the data we want to write to 0x4010 and 0x4011, respectively.
All entries in bold have been mapped and are useful.
Address | Description |
---|---|
$0000 - $0098 | Partial String Table |
$0098 - $00fb | ?? (Possibly a continuation of .data segment) |
$00fc | Box Model |
$00fd - $00ff | Firmware Version |
Address | Description |
---|---|
$4000 | r0 (CPU Register) |
$4001 | r1 (CPU Register) |
$4002 | r2 (CPU Register) |
$4003 | r3 (CPU Register) |
$4004 | r4 (CPU Register) |
$4005 | r5 (CPU Register) |
$4006 | r6 (CPU Register) |
$4007 | r7 (CPU Register) |
$4008 | r8 (CPU Register) |
$4009 | r9 (CPU Register) |
$400a | r10 (CPU Register) |
$400b | r11 (CPU Register) |
$400c | r12 (CPU Register) |
$400d | r13 (CPU Register) |
$400e | r14 (CPU Register) |
$400f | r15/Front Panel Pot Lockout Flags - COMM_SYSTEM_FLAG |
$4010 | r16 (CPU Register) |
$4011 | r17 (CPU Register) |
$4012 | r18 (CPU Register) |
$4013 | r19 (CPU Register) |
$4014 | r20 (CPU Register) |
$4015 | r21 (CPU Register) |
$4016 | r22 (CPU Register) |
$4017 | r23 (CPU Register) |
$4018 | r24 (CPU Register) |
$4019 | r25 (CPU Register) |
$401a | r26 (CPU Register) |
$401b | r27 (CPU Register) |
$401c | r28 (CPU Register) |
$401d | r29 (CPU Register) |
$401e | r30 (CPU Register) |
$401f | r31 (CPU Register) |
$4020 | TWBR (IO Register) |
$4021 | TWSR (IO Register) |
$4022 | TWAR (IO Register) |
$4023 | TWDR (IO Register) |
$4024 | ADCL (IO Register) |
$4025 | ADCH (IO Register) |
$4026 | ADCSRA (IO Register) |
$4027 | ADMUX (IO Register) |
$4028 | ACSR (IO Register) |
$4029 | UBRRL (IO Register, Baud Rate) |
$402a | UCSRB (IO Register) |
$402b | UCSRA (IO Register) |
$402c | UDR (IO Register) |
$402d | SPCR (IO Register) |
$402e | SPSR (IO Register) |
$402f | SPDR (IO Register) |
$4030 | PIND (IO Register) |
$4031 | DDRD (IO Register) |
$4032 | PORTD (IO Register) |
$4033 | PINC (IO Register) |
$4034 | DDRC (IO Register) |
$4035 | PORTC (IO Register) |
$4036 | PINB (IO Register) |
$4037 | DDRB (IO Register) |
$4038 | PORTB (IO Register) |
$4039 | PINA (IO Register) |
$403a | DDRA (IO Register) |
$403b | PORTA (IO Register) |
$403c | EECR (IO Register) |
$403d | EEDR (IO Register) |
$403e | EEARL (IO Register) |
$403f | EEARH (IO Register) |
$4040 | UBRRH/UCSRC (IO Register) |
$4041 | WDTCR (IO Register) |
$4042 | ASSR (IO Register) |
$4043 | OCR2 (IO Register) |
$4044 | TCNT2 (IO Register) |
$4045 | TCCR2 (IO Register) |
$4046 | ICR1L (IO Register) |
$4047 | ICR1H (IO Register) |
$4048 | OCR1BL (IO Register) |
$4049 | OCR1BH (IO Register) |
$404a | OCR1AL (IO Register) |
$404b | OCR1AH (IO Register) |
$404c | TCNT1L (IO Register) |
$404d | TCNT1H (IO Register) |
$404e | TCCR1B (IO Register) |
$404f | TCCR1A (IO Register) |
$4050 | SFIOR (IO Register) |
$4051 | OSCCAL/OCDR (IO Register) |
$4052 | TCNT0 (IO Register) |
$4053 | TCCR0 (IO Register) |
$4054 | MCUCSR (IO Register) |
$4055 | MCUCR (IO Register) |
$4056 | TWCR (IO Register) |
$4057 | SPMCSR (IO Register) |
$4058 | TIFR (IO Register) |
$4059 | TIMSK (IO Register) |
$405a | GIFR (IO Register) |
$405b | GICR (IO Register) |
$405c | OCR0 (IO Register) |
$405d | SPL (IO Register) |
$405e | SPH (IO Register) |
$405f | SREG (IO Register) |
$4060 | COMM_MAIN_CBLOCK_BASE |
$4061 | Multi Adjust Offset - CBLOCK_MULTI_A_OFFSET |
$4062 | Power Supply Voltage |
$4063 | Battery Voltage |
$4064 | CurrentLevel A - CBLOCK_POT_A_OFFSET |
$4065 | CurrentLevel B - CBLOCK_POT_B_OFFSET |
$4066 | Audio Input Level A |
$4067 | Audio Input Level B |
$4068 | ?? |
$4069 | Currently Pressed Button |
$406A | ?? (some counter) |
$406B | ?? |
$406C | ?? |
$406D | Menu State |
$406E | ?? |
$406F | ?? |
$4070 | Execute Command |
$4071 | ?? (does something when written to) |
$4072 | ?? (random number in random modes) |
$4073 | ?? (some timer) |
$4074 | ?? (writing disables MA) |
$4075 | ?? (writing does nothing, changes in random modes) |
$4076 | ?? (00) |
$4077 | ?? (00) |
$4078 | Current Menu Selection |
$4079 | Lowest Selectable Mode |
$407A | Highest Selectable Mode |
$407b | Current Mode |
$407c | ?? (Oscillator Ch A? ) |
$407d | ?? (Oscillator Ch A? ) |
$407e | ?? (Oscillator Ch B? ) |
$407F | ?? (Oscillator Ch B? ) |
$4080 | ?? (gets set to 0x00 when routine loaded) |
$4081 | ?? |
$4082 | ?? |
$4083 | Output Control Flags - COMM_CONTROL_FLAG |
$4084 | ?? (gets set to 0x00 when routine loaded) |
$4085 | ?? (gets set to 0x03 when routine loaded) |
$4086 | Multi Adjust Range High End |
$4087 | Multi Adjust Range Low End |
$4088 | Routine timer low |
$4089 | Routine timer high |
$408A | ?? (gets set to 0x00 when routine loaded) |
$408B | ?? (some timer) |
$408C | ?? (gets set to 0x00 when routine loaded) |
$408D | ?? (used by torment routine) |
$408E | ?? (used by torment routine) |
$408F | ?? (gets set to 0x00 when routine loaded) |
$4090 | Channel A: Current Gate Value (0 when no output) |
$4091 | ?? |
$4092 | ?? |
$4093 | ?? |
$4094 | ?? |
$4095 | ?? |
$4096 | ?? |
$4097 | ?? |
$4098 | Channel A: Current Gate OnTime |
$4099 | Channel A: Current Gate OffTime |
$409A | Channel A: Current Gate Select |
$409B | ?? |
$409C | Mode Switch Ramp Value Counter |
$40A0 | ?? |
$40A1 | ?? |
$40A2 | ?? |
$40A3 | Mode Switch Ramp Select |
$40A4 | ?? |
$40A5 | Channel A: Current Intensity Modulation Value |
$40A6 | Channel A: Current Intensity Modulation Min |
$40A7 | Channel A: Current Intensity Modulation Max |
$40A8 | Channel A: Current Intensity Modulation Rate |
$40A9 | ?? |
$40AA | ?? |
$40AB | ?? |
$40ac | Channel A: Current Intensity Modulation Select |
$40AD | ?? |
$40ae | Channel A: Current Frequency Modulation Value |
$40af | Channel A: Current Frequency Modulation Min |
$40b0 | Channel A: Current Frequency Modulation Max |
$40B1 | Channel A: Current Frequency Modulation Rate |
$40b2 | ?? |
$40b3 | ?? |
$40b4 | ?? |
$40b5 | Channel A: Current Frequency Modulation Select |
$40b6 | ?? |
$40b7 | Channel A: Current Width Modulation Value |
$40b8 | Channel A: Current Width Modulation Min |
$40b9 | Channel A: Current Width Modulation Max |
$40ba | Channel A: Current Width Modulation Rate |
$40bb | ?? |
$40bc | ?? |
$40bd | ?? |
$40be | Channel A: Current Width Modulation Select |
$41bf | ?? |
$40c0 - $4177 | Space for User Routine Scratchpad A |
$4180 | Write LCD Parameter |
$4181 | Write LCD Position |
$4182 | ?? |
$4183 | ?? |
$4184 | ?? |
$4185 | ?? |
$4186 | ?? |
$4187 | ?? |
$4188 | ?? |
$4189 | ?? |
$418A | ?? |
$418B | ?? |
$418C | ?? |
$418D | ?? |
$418E | ?? |
$418F | ?? |
$4190 | Channel A: Current Gate Value (0 when no output) |
$4191 | ?? |
$4192 | ?? |
$4193 | ?? |
$4194 | ?? |
$4195 | ?? |
$4196 | ?? |
$4197 | ?? |
$4198 | Channel B: Current Gate OnTime |
$4199 | Channel B: Current Gate OffTime |
$419A | Channel B: Current Gate Select |
$419B | ?? |
$419C | ?? (Ramp Value?) |
$41A0 | ?? |
$41A1 | ?? |
$41A2 | ?? |
$41A3 | ?? (Ramp Select?) |
$41A4 | ?? |
$41A5 | Channel B: Current Intensity Modulation Value |
$41A6 | Channel B: Current Intensity Modulation Min |
$41A7 | Channel B: Current Intensity Modulation Max |
$41A8 | Channel B: Current Intensity Modulation Rate |
$41A9 | ?? |
$41AA | ?? |
$41AB | ?? |
$41ac | Channel B: Current Intensity Modulation Select |
$41AD | ?? |
$41ae | Channel B: Current Frequency Modulation Value |
$41af | Channel B: Current Frequency Modulation Min |
$41b0 | Channel B: Current Frequency Modulation Max |
$41B1 | Channel B: Current Frequency Modulation Rate |
$41b2 | ?? |
$41b3 | ?? |
$41b4 | ?? |
$41b5 | Channel B: Current Frequency Modulation Select |
$41b6 | ?? |
$41b7 | Channel B: Current Width Modulation Value |
$41b8 | Channel B: Current Width Modulation Min |
$41b9 | Channel B: Current Width Modulation Max |
$41ba | Channel B: Current Width Modulation Rate |
$41bb | ?? |
$41bc | ?? |
$41bd | ?? |
$41be | Channel B: Current Width Modulation Select |
$41bf | ?? |
$41c0 | ?? |
$41c1 | ?? |
$41c2 | ?? |
$41c3 | ?? |
$41c4 | ?? |
$41c5 | ?? |
$41c6 | ?? |
$41c7 | ?? |
$41c8 | ?? |
$41c9 | ?? |
$41ca | ?? |
$41cb | ?? |
$41cc | ?? |
$41cd | ?? |
$41ce | ?? |
$41cf | ?? |
$41D0 - $41ef | Space for User Routine Scratchpad B |
$41f0 | ?? (Counter) |
$41f1 | ?? (Crashes on write) |
$41f2 | ?? (Unknown) |
$41f3 | CurrentTopMode (written during routine write) |
$41f4 | PowerLevel - COMM_POWER_LEVEL / COMM_LMODE |
$41f5 | Split Mode Number A |
$41f6 | Split Mode Number B |
$41f7 | Favourite Mode |
$41F8 | Advanced Parameter: RampLevel |
$41F9 | Advanced Parameter: RampTime |
$41FA | Advanced Parameter: Depth |
$41FB | Advanced Parameter: Tempo |
$41FC | Advanced Parameter: Frequency |
$41FD | Advanced Parameter: Effect |
$41FE | Advanced Parameter: Width |
$41FF | Advanced Parameter: Pace |
$4200 | ?? |
$4201 | ?? |
$4202 | ?? |
$4203 | ?? |
$4204 | ?? |
$4205 | ?? |
$4206 | ?? |
$4207 | ?? |
$4208 | ?? |
$4209 | ?? |
$420a | ?? |
$420b | ?? |
$420c | ?? |
$420d | Current Multi Adjust Value / COMM_MULTI_AVG |
$420e - $4212 | ?? |
$4213 | ?? (Writing 0 kills serial communication) |
$4214 - $422c | ?? |
$422d - $43FF | Possibly Unused (can zero out, never see changes) |
Address | Description |
---|---|
$8000 | ?? |
$8001 | ?? |
$8002 | BoxSerial1 |
$8003 | BoxSerial2 |
$8004 | ?? |
$8005 | ?? |
$8006 | ELinkSig1 - ELINK_SIG1_ADDR |
$8007 | *ELinkSig2 - ELINK_SIG2_ADDR * |
$8008 | TopMode NonVolatile (written during routine write) |
$8009 | PowerLevel |
$800A | SplitAModeNum |
$800B | SplitBModeNum |
$800C | Favourite Mode |
$800D | Advanced Parameter: RampLevel |
$800E | Advanced Parameter: RampTime |
$800F | Advanced Parameter: Depth |
$8010 | Advanced Parameter: Tempo |
$8011 | Advanced Parameter: Frequency |
$8012 | Advanced Parameter: Effect |
$8013 | Advanced Parameter: Width |
$8014 | Advanced Parameter: Pace |
$8015 | ?? |
$8016 | ?? |
$8017 | ?? |
$8018 | Start Vector User 1 - COMM_USER_BASE |
$8019 | Start Vector User 2 |
$801A | Start Vector User 3 |
$801B | Start Vector User 4 |
$801C | Start Vector User 5 |
$801D | Start Vector User 6 |
$801E | Start Vector User 7 (not implemented) |
$801F | Start Vector User 8 (not implemented) |
$8020 - $803f | Space for User Routines A |
$8040 - $80ff | Space for User Routines B |
$8100 - $813f | Space for User Routines C |
$8120 - $81ff | Space for User Routines D |
Contains a portion of the string table used for the UI on the ET312 LCD. Each string is 8 bytes long, padded by spaces (0x20) if needed, with no null termination.
Unknown contents. This area may possibly be other constant setup in the .data section of the firmware.
For the ET312, this will always be 0x0c. (Checked in v1.5 and v1.6 firmware)
The Major, Minor, and Interval revision for the firmware on the ET312. Usually something like
0x01 0x06 0x00
For the v1.6 firmware
Byte used to enable/disable front panel potentiometers.
Value | Description |
---|---|
0x01 | Disable Level Pots (SYSTEM_FLAG_POTS_DISABLE_MASK) |
0x08 | Disable Multi Adjust (SYSTEM_FLAG_MULTIA_POT_DISABLE_MASK) |
Once the front panel potentiometers have been disabled you can then send commands to change the A, B, and MA levels directly. Enabling again sets the unit back to the actual potentiometer values.
To set the A level write to $4064 (CurrentLevelA 0-255), to set the B level write to $4065 (CurrentLevel B 0-255), to set the MA write to $420D (Current Multi Adjust Value, range from min at $4086 to max at $4087).
The low byte of the Serial I/O Register.
By default, this is set to 0x19, with the U2X bit in $402b (UCSRA) set to 0, meaning that at the 8mhz clock, the serial port will run at 19200 baud. If this byte is set to 0x0c, the serial port will run at 38400 baud with no noticeable effects on the ET312.
Other non-standard, higher baud rates may be possible, but testing has not been successful thus far. See http://wormfood.net/avrbaudcalc.php for baud rate calculations, using the 8mhz table.
Contains the U2X bit for doubling serial baud rates. Testing of setting the U2X bit has usually ended in ET312 communications no longer working properly (checksum errors).
Value | Description |
---|---|
0x00 | Reset Current Routine |
0x02 | Display Status Screen |
0x03 | Select current Menu Item |
0x04 | Exit Menu |
0x05 | Start “Favourite” Routine |
0x06 | (Failure 16) |
0x07 | Edit Advanced Parameter |
0x08 | display next menu item |
0x09 | display previous menu item |
0x0a | Show Main Menu |
0x0b | Jump to split mode settings menu |
0x0c | Activates Split Mode |
0x0d | Advanced Value Up |
0x0e | Advanced Value Down |
0x0f | Show Advanced Menu |
0x10 | Switch to Next mode |
0x11 | Switch to Previous mode |
0x12 | New Mode |
0x13 | Write Character to LCD |
0x14 | Write Number to LCD |
0x15 | Write String from Stringtable to LCD |
0x16 | (mutes or glitches current routine) |
0x17 | Cold Reboot |
0x18 | Stop Routine (Mute) |
0x19 | Swap Channel A and B |
0x1a | Copy Channel A to Channel B |
0x1b | Copy Channel B to Channel a |
0x1c | Default EE |
0x1d | Copy Wave |
0x1e | (Failure 04) |
0x1f | (Failure 80) |
0x20 | Advanced Update |
0x21 | Start Ramp |
0x22 | (no visible effect) |
0x23 | (LCD Command?) |
0x24 | (LCD Character?) |
0x25 | (Failure 00) |
0x26 | (Failure 00) |
0x27 | (Failure 00) |
Note: Parameters for the LCD write command
Command | $4180 | $4181 |
---|---|---|
Write Character (0x13) | Character ASCII value | Display Position (+64 = second row) |
Write Number (0x14) | Numerical Value | Display Position (+64 = second row) |
Write String (0x15) | Stringtable Index | ??? |
Value | Description |
---|---|
0x00 | MODE_NUM_POWER_ON |
0x01 | MODE_NUM_UNKNOWN |
0x76 | MODE_NUM_WAVES / MODE_NUM_LOWER |
0x77 | MODE_NUM_STROKE |
0x78 | MODE_NUM_CLIMB |
0x79 | MODE_NUM_COMBO |
0x7a | MODE_NUM_INTENSE |
0x7b | MODE_NUM_RHYTHM |
0x7c | MODE_NUM_AUDIO1 |
0x7d | MODE_NUM_AUDIO2 |
0x7e | MODE_NUM_AUDIO3 |
0x7f | MODE_NUM_SPLIT |
0x80 | MODE_NUM_RANDOM1 |
0x81 | MODE_NUM_RANDOM2 |
0x82 | MODE_NUM_TOGGLE |
0x83 | MODE_NUM_ORGASM |
0x84 | MODE_NUM_TORMENT |
0x85 | MODE_NUM_PHASE1 |
0x86 | MODE_NUM_PHASE2 |
0x87 | MODE_NUM_PHASE3 |
0x88 | MODE_NUM_USER1 |
0x89 | MODE_NUM_USER2 |
0x90 | MODE_NUM_USER3 |
0x91 | MODE_NUM_USER4 |
0x92 | MODE_NUM_USER5 |
0x93 | MODE_NUM_USER6 |
0x94 | MODE_NUM_USER7 / MODE_NUM_UPPER |
Note: To set mode
- Write New Mode Number to $407b
- Write 0x04 to $4070 (execute “main menu”)
- Wait 18ms (lets box execute previous command)
- Write 0x10 to $4070 (execute “next mode” to refresh display)
- Wait 18ms (lets box execute previous command)
Value | Description |
---|---|
0x01 | Phase Control |
0x02 | Mute |
0x04 | Phase Control 2 |
0x08 | Phase Control 3 |
0x20 | Disable Frontpanel Switches |
0x40 | Mono Mode (off=Stereo) |
Note: ErosLink uses the following masks:
- 0x00 - CONTROLFLAG_NORMAL_MASK
- 0x04 - CONTROLFLAG_ALLOW_OVERLAP_MASK
- 0x05 - CONTROLFLAG_PHASE_MASK
- 0x20 - CONTROLFLAG_DISABLE_SWITCHES_MASK
Sets the time on for the current gate ($409A).
Sets the time on for the current gate ($409A).
Sets which channel gating commands will control.
Value | Description |
---|---|
0x01 | Channel A |
0x02 | Channel B |
0x03 | Channel A+B |
1 byte, Range 128-255 (Range taken from erosoutsider perl script)
1 byte, Range 128-255 (Range taken from erosoutsider perl script)
1 byte, Range 128-255 (Range taken from erosoutsider perl script)
1 byte, Range 0-255, 0 is fastest (Range taken from erosoutsider perl script)
Bits 0-4 (upper nibble): Min Options Bits 5-8 (lower nibble): Rate Options (Range taken from erosoutsider perl script)
1 byte, Range 8-255 (?!), 8 is fastest (Range taken from erosoutsider perl script)
1 byte, Range 8-255 (?!), 8 is fastest (Range taken from erosoutsider perl script)
1 byte, Range 8-255 (?!), 8 is fastest (Range taken from erosoutsider perl script)
1 byte, Range 0-255, 0 is fastest (Range taken from erosoutsider perl script)
Bits 0-4 (upper nibble): Val Options Bits 5-8 (lower nibble): Rate Options (Range taken from erosoutsider perl script)
1 byte, Range 64-196 (?!) (Range taken from erosoutsider perl script)
1 byte, Range 64-196 (?!) (Range taken from erosoutsider perl script)
1 byte, Range 64-196 (?!) (Range taken from erosoutsider perl script)
1 byte, Range 0-255, 0 is fastest (Range taken from erosoutsider perl script)
Bits 0-4 (upper nibble): Val Options Bits 5-8 (lower nibble): Rate Options (Range taken from erosoutsider perl script)
Value | Description |
---|---|
0x00 | LOW |
0x01 | NORMAL |
0x02 | HIGH |
0x03 | UNKNOWN |