| 153 | There are several classes of things stored in flash: operational settings, |
---|
| 154 | volumes (ie: the mixer status) and configuration/firmware. Device settings |
---|
| 155 | start at address 0x3000f0000 on the FF800 and 0x00060000 on the FF400. |
---|
| 156 | |
---|
| 157 | Mixer (volume) data starts at 0x3000e0000 on the FF800 and 0x00060000 on the |
---|
| 158 | FF400. Mixer volumes are written in 64-quadlet (256-byte) blocks, one per |
---|
| 159 | hardware channel. There are 28 hardware channels for the FF800 and 18 for |
---|
| 160 | the FF400. |
---|
| 161 | |
---|
| 162 | There are several control groups in the mixer: |
---|
| 163 | 0xe0000 (FF800): "mixer shadow", FF800 only, meaning unclear |
---|
| 164 | 0xe2000 (FF800) / 0x70000 (FF400), 0x0800 bytes: 16-bit volume array |
---|
| 165 | 0xe2800 (FF800) / 0x70800 (FF400), 0x0800 bytes: 16-bit pan array |
---|
| 166 | 0xe3000 (FF800) / 0x71000 (FF400), 0x0040 bytes: 16-bit "vol3" array + |
---|
| 167 | "enable MIDI" + "submix" + zero padding to 64 bytes |
---|
| 168 | The third row are the "hardware output volumes". |
---|
| 169 | |
---|
| 170 | The meaning of the "mixer shadow" section of the mixer flash is not |
---|
| 171 | understood at present. |
---|
| 172 | |
---|
| 173 | |
---|
| 174 | Reading the flash |
---|
| 175 | |
---|
| 176 | For the FF800 the entire buffer is read directly from flash as a single block. |
---|
| 177 | Polling for "device not busy" should commence after a wait of 5 ms. |
---|
| 178 | |
---|
| 179 | For the FF400, the buffer is read in 32-quadlet sub-blocks. A partial block |
---|
| 180 | is read at the end if the total buffer size is not a multiple of |
---|
| 181 | 32-quadlets. To read a sub-block, the address is placed in register |
---|
| 182 | 0x80100288 and the sub-block size (in bytes) in 0x8010028c. A 0x02 is |
---|
| 183 | then written to CBA+(8*4) to initiate the read. Polling for "device not |
---|
| 184 | busy" should commence after a wait of 2 ms. |
---|
| 185 | |
---|
| 186 | |
---|
| 187 | Writing the flash |
---|
| 188 | |
---|
| 189 | For the FF800, the entire buffer is written to flash as a single block. |
---|
| 190 | Polling for "device not busy" should commence after a wait of 5 ms. |
---|
| 191 | |
---|
| 192 | For the FF400, the buffer is written in 32-quadlet (128-byte) sub-blocks via |
---|
| 193 | a bounce buffer. If the final sub-block is not 32-quadlets the write is only |
---|
| 194 | as big as the sub-block (that is, no padding takes place). The sub-block |
---|
| 195 | data to be written is sent to register 0x80100290. The 2-quadlet register |
---|
| 196 | at 0x80100288 is set with the flash address to write the block to and the |
---|
| 197 | size (in bytes) of the data block. Finally, a 0x1 is written to CBA+(8*4) |
---|
| 198 | to initiate the write. Polling for "device not busy" should commence after |
---|
| 199 | a wait of 2 ms. |
---|
| 200 | |
---|
| 201 | |
---|
| 202 | Erasing the flash |
---|
| 203 | |
---|
| 204 | The flash is divided into sections and it is possible to erase each section |
---|
| 205 | separately. Therefore one only has to erase section of interest when |
---|
| 206 | changing something. |
---|
| 207 | |
---|
| 208 | On the FF400, erasure is controlled by writing a special magic number to |
---|
| 209 | the the flash erase control register (CBA+8*4): |
---|
| 210 | Erase volume: write 0xe |
---|
| 211 | Erase settings: write 0xd |
---|
| 212 | Erase configuration (firmware): write 0xc |
---|
| 213 | |
---|
| 214 | On the FF800, erasing is controlled by writing 0 to the applicable register: |
---|
| 215 | Erase volume: register is 0x3fffffff4 |
---|
| 216 | Erase settings: register is 0x3fffffff0 |
---|
| 217 | Erase firmware: register is 0x3fffffff8 |
---|
| 218 | Erase configuration: register is 0x3fffffffc |
---|
| 219 | |
---|
| 220 | It's not clear what the distinction between "configuration" and "firmware" |
---|
| 221 | is. The FF400 appears to only support "configuration" but treats this as |
---|
| 222 | "firmware". The FF800 supports both as distinct options. |
---|
| 223 | |
---|
| 224 | After issuing the erase command one should wait for 500 ms before polling |
---|
| 225 | the device for the "not busy" status. |
---|
| 226 | |
---|
| 227 | |
---|
| 228 | Waiting for flash |
---|
| 229 | |
---|
| 244 | |
---|
| 245 | |
---|
| 246 | Device settings format |
---|
| 247 | ---------------------- |
---|
| 248 | |
---|
| 249 | The device settings are stored in flash as an array of 32 bit unsigned |
---|
| 250 | integers. These are: |
---|
| 251 | - Device ID |
---|
| 252 | - Device revision |
---|
| 253 | - ASIO latency |
---|
| 254 | - Samples per frame |
---|
| 255 | SPDIF input mode (0=coax?, 1=optical?) |
---|
| 256 | SPDIF output emphasis active |
---|
| 257 | SPDIF output is "professional" (ie: AES/EBU) |
---|
| 258 | Clock mode (0=master?, 1=autosync?) |
---|
| 259 | SPDIF output is non-audio (eg: AC3 passthrough) |
---|
| 260 | Sync reference |
---|
| 261 | SPDIF output mode (0=coax?, 1=optical?) |
---|
| 262 | - Check input |
---|
| 263 | - Status |
---|
| 264 | - Register[4] |
---|
| 265 | - Iso receive channel |
---|
| 266 | - Iso transmit channel |
---|
| 267 | - Timecode |
---|
| 268 | - Number of devices |
---|
| 269 | - TMS |
---|
| 270 | - Speed |
---|
| 271 | - Channels available (high) |
---|
| 272 | - Channels available (low) |
---|
| 273 | Limit bandwidth setting |
---|
| 274 | - Bandwidth allocated |
---|
| 275 | - Stop on dropout |
---|
| 276 | Input level |
---|
| 277 | Output level |
---|
| 278 | Mic level [0] - FF400:Phoneslevel-1 / F800:AnalogInput[1]* ??? |
---|
| 279 | Mic level [1] - AnalogInput[2] ??? |
---|
| 280 | Mic phantom power [4] |
---|
| 281 | Instrument - AnalogInput[0]-1 ??? |
---|
| 282 | Filter (aka speaker emulation) |
---|
| 283 | Fuzz (aka drive) |
---|
| 284 | Sync align |
---|
| 285 | - Device index |
---|
| 286 | - Advanced dialog |
---|
| 287 | Sample rate |
---|
| 288 | - Interleaved |
---|
| 289 | - Sn |
---|
| 290 | Word clock single speed |
---|
| 291 | - Number of channels |
---|
| 292 | - Dropped samples |
---|
| 293 | p12db_an[0] - Limiter==0&&AnalogInput[0]==2*: 1 else 0 ??? |
---|
| 294 | - p12db_an[1-9] |
---|
| 295 | |
---|
| 296 | "-" = elements not used |
---|