Ewen found for me the proper Silvercrest website which had tools for the Silvercrest version of the SL-65. Thanks Ewen!
Great! AliEditor connected to my receiver, so I could now back up the firmware, and be able to look at the channel listings.
It was a good idea, and might have worked had the dopey software not decided upon creating a zero-length dump. Lovely!
The available commands (looking in the firmware dump) appear to be:
address
b
burn
c
comtest
dump
move
reboot
transfer
transferraw
version
Data read from the receiver is marked in light blue.
Data written to the receiver is marked in light read.
It appears that the receiver may echo some stuff.
The leftmost column describes the operation.
The next column shows the data in a cooked ASCII form.
The right column shows the data in hex, with 0x prefix so you know.
Set buffer | RxSize: 4096 TxSize: 0 | |
Set state | Flags: fff Baud: 115200 Bits: 8 Stop: 1 Parity: Even | |
Set buffer | RxSize: 10000 TxSize: 10000 | |
Write byte | c | 0x63 |
Read byte | c | 0x63 |
Write byte | o | 0x6F |
Read byte | o | 0x6F |
Write byte | m | 0x6D |
Read byte | m | 0x6D |
Write byte | t | 0x74 |
Read byte | t | 0x74 |
Write byte | e | 0x65 |
Read byte | e | 0x65 |
Write byte | s | 0x73 |
Read byte | s | 0x73 |
Write byte | t | 0x74 |
Read byte | t | 0x74 |
Write byte | | 0x20 |
Write byte | . | 0x0D |
Write byte | c | 0x63 |
Write byte | . | 0x0D |
Read 14 bytes | APP init ok.. | 0x41 50 50 20 20 69 6E 69 74 20 6F 6B 0D 0A |
Write byte | c | 0x63 |
Write byte | . | 0x0D |
Write byte | c | 0x63 |
Read byte | . | 0x0A |
Write byte | . | 0x0D |
Read 11 bytes | >:..>:c..>: | 0x3E 3A 0D 0A 3E 3A 63 0D 0A 3E 3A |
Write byte | c | 0x63 |
Read byte | c | 0x63 |
Write byte | o | 0x6F |
Read byte | o | 0x6F |
Write byte | m | 0x6D |
Read byte | m | 0x6D |
Write byte | t | 0x74 |
Read byte | t | 0x74 |
Write byte | e | 0x65 |
Read byte | e | 0x65 |
Write byte | s | 0x73 |
Read byte | s | 0x73 |
Write byte | t | 0x74 |
Read byte | t | 0x74 |
Write byte | | 0x20 |
Read byte | | 0x20 |
Write byte | 1 | 0x31 |
Read byte | 1 | 0x31 |
Write byte | 0 | 0x30 |
Read byte | 0 | 0x30 |
Write byte | . | 0x0D |
Read byte | . | 0x0D |
Write byte | a | 0x61 |
Read byte | a | 0x61 |
Write byte | l | 0x6C |
Read byte | l | 0x6C |
Write byte | i | 0x69 |
Read byte | i | 0x69 |
Write byte | | 0x20 |
Read byte | | 0x20 |
Write byte | | 0x20 |
Read byte | | 0x20 |
Write byte | D | 0x44 |
Read byte | D | 0x44 |
Write byte | V | 0x56 |
Read byte | V | 0x56 |
Write byte | B | 0x42 |
Read byte | B | 0x42 |
Write byte | - | 0x2D |
Read byte | - | 0x2D |
Write byte | S | 0x53 |
Read byte | S | 0x53 |
Read 3 bytes | .>: | 0x0A 3E 3A |
Write byte | d | 0x64 |
Read byte | d | 0x64 |
Write byte | u | 0x75 |
Read byte | u | 0x75 |
Write byte | m | 0x6D |
Read byte | m | 0x6D |
Write byte | p | 0x70 |
Read byte | p | 0x70 |
Write byte | . | 0x0D |
Read byte | . | 0x0D |
Read 4 bytes | . .. | 0x00 20 00 00 |
Write byte | O | 0x4F |
Read byte | ã | 0xE3 |
Read byte | . | 0x00 |
Read byte | . | 0x00 |
Read byte | . | 0x10 |
Read byte | . | 0x00 |
Read byte | . | 0x00 |
Read byte | . | 0x00 |
Read byte | . | 0x00 |
Read byte | . | 0x00 |
Read byte | . | 0x01 |
Read byte | . | 0x00 |
Read byte | . | 0x00 |
Read byte | N | 0x4E |
Read byte | C | 0x43 |
Read byte | R | 0x52 |
Read byte | C | 0x43 |
Read byte | b | 0x62 |
Read byte | o | 0x6F |
Read byte | o | 0x6F |
Read byte | t | 0x74 |
Read byte | l | 0x6C |
Read byte | o | 0x6F |
Read byte | a | 0x61 |
Read byte | d | 0x64 |
Read byte | e | 0x65 |
Read byte | r | 0x72 |
Read byte | . | 0x00 |
Read byte | . | 0x00 |
Read byte | . | 0x00 |
Read byte | . | 0x00 |
Read byte | Dump continues... |
Therefore...
It appears that we begin the process by outputting:
comtest [0D]c[0D]
to a serial port running at 115,200bps with the protocol of 8 data bits, 1 stop bit, even parity - usually abbreviated to "115200 8E1". Note - 8E1, not 8N1.
Just in case clarification is required - the values in square brackets that are italicised (for example
The receiver would appear to echo the "comtest" but not the final four bytes.
The receiver will reply with:
APP init ok[0D][0A]
We then output:
c[0D]c[0A][0D]
Note that the CRLF sequence is reversed.
The receiver then replies with:
>:[[0A][0D]>:c[0A][0D]>:
Again, note that the CRLF sequences are reversed.
At this point, the front panel LEDs will say
We now send the command:
comtest 10[0D]ali DVB-S
to which the receiver replies with a command-line of sorts:
[0A]>:
At this point, the front panel LEDs will say
We send the command:
dump[0D]
The receiver replies with four bytes:
[00][20][00][00]
In little-endian (Motorola/ARM) byte ordering, this equates to "1<<16" which is 2,097,152 - or two megabytes. This is probably the size of the dump that is to be returned.
At this point, the front panel LEDs will say
We then output:
O
(upper case 'o', perhaps for "ok"?)
The receiver will then reply with loads of data. A complete dump of the 2Mb FlashROM.
It appears that there is no official 'finish' to the transfer, and currently if you don't catch all the data in time, stuff gets missed.
I have my suspicions that AliEditor may be abandoning the transfer due to the speed of the serial link. Let's put it like this - I regularly transfer files to/from my RiscPC at 115,200bps using HyperTerm and HearSay2. Sending to the 40MHz ARM is no trouble whatsoever - the RiscPC can more than keep up.
Returning data (from the 40MHz RiscPC) to the 466MHz Celeron PC results in numerous retries and communications errors. It will work, as Zmodem is robust, but it appears the PC frequently loses bytes.
Now, I know you cannot compare clock speeds of a RISC and a CISC processor, and I know one is running a hand-crafted assembler operating system and the other Windows... but whichever way you slice the cake, the brute speed of the PC is eleven times faster, not to mention a memory subsystem probably clocking around 66MHz (instead of the RiscPC's 12MHz bottleneck).
Anyway, the point isn't to slag off the x86's interrupt latency or Windows serial port handling, the point is to try to come up with reasons why AliEditor is not working for me - as surely if it simply does not work, somebody at Silvercrest might have noticed by now!
Here are the changes required to update v0.02:
char appvers[] = "0.03";
char appdate[] = "2007/04/01";
outp((port + 2), 129); /* FIFO trigger after 8 bytes; give us room */
int lsr = 0;
int lsr = 0;
/* Turn off RTS during read - we are NOT ready */
outp((port + 4), 9); /* nDTR and OUT2 */
outp(0x20, 0x20); /* Flag IRQ handled */
outp(0x20, 0x20); /* Flag IRQ handled */
/* Turn on RTS again */
outp((port + 4), 11); /* nDTR, nRTS, and OUT2 - we can go again */
OUT1
" updated to read OUT2
like it should), but these do not affect the functionality of the software...
Serial port setup could be improved by disabling interrupts around the setup code (using disable();
and enable();
). As it happens, this makes little difference, and I am not happy about disabling interrupts unless it is absolutely critical.
FINALLY - go to the compiler options and ensure that the choice for "Register variables
" is off. I had, previously, set it to automatic. It appears that the compiler may generate bogus interrupt handling code if this option is incorrectly set.
It seems to make little difference in practice, however the built-in help explicitly states: When you use the interrupt keyword, the Stack warning checkbox should be unchecked (off) and the Register Variables option should be set to None.