Avalon6
Basic Information
Hashrate: 3.5T (+-5%) Power consumption: 990W (measure on 12V port of the device) 1100W (on the wall, with assumption of 90% power conversion ratio) Power per hash: 270J/THash (device only) 295J/THash (on the wall, with assumption of 90% power conversion ratio) Overclocking: Support automatically optimize frequency, no need to overclock manually. PSU output pin: 4x6PIN PCIe power connector. *All must be connected.* PSU requirements: Minimum 1100W output, recommend to use high-quality PSU for server with more than 1200W output and high quality power cable. Input voltage no lower than 11.7V and no higher than 12.2V (numbers take from the controller) Lower voltage leads to lower hashrate and higher voltage leads to possible device burning down. NOTICE: Poor quality cable may result in low voltage. Fan: Specs: 12038 Current: between 1.6A and 2.8A. Minimum RPM: 3800. *NOTICE* If the fan is broken or the fan's RPM cannot be measure, the device will not start. Controller: Raspberry Pi (version B or B+) Raspberry Pi 2 will be supported at the middle of December 2015 Each Rpi can control approximately ~12 devices. AUC: Each AUC can connect up to 6 devices. Dimensions: 354x136x150mm Net weight: ~4.8kg Protection Degree: IP20
LED
Avalon6 LED
LED Status | MEMO |
---|---|
White | Power on |
Blue | Working normally |
Yellow blinking | Idle normally |
Green blinking | Detect fan and mcu |
White blinking | Turn on LED manually |
Red blinking | Toohot/Loopback failed/PG failed/Coretest failed/Voltage error/Temperature sensor error/No fan |
AUC2 LED
LED Status | MEMO |
---|---|
Blue | Initializing or Idle normally |
Green | Working normally |
Red | Communication failed |
MM Error Codes
CODE | NAME | TYPE | MEMO | What to do |
---|---|---|---|---|
1 | CODE_IDLE | WARN | Idle | Check if the network is ok or AUC is work normally |
2 | CODE_TOOHOT | FATAL | Too hot | Check if the fan is connect successfully |
4 | CODE_LOOP0FAILED | FATAL | Channel 0 loopback failed | Replace a new hash unit for channel 0 if PG0 is ok |
8 | CODE_LOOP1FAILED | FATAL | Channel 1 loopback failed | Replace a new hash unit for channel 1 if PG1 is ok |
16 | CODE_INVALIDMCU | FATAL | MCU cann't be detected | Replace a new CTRL board |
32 | CODE_NOSTRATUM | WARN | No stratum | Check if the network is ok or AUC is work normally |
64 | CODE_RBOVERFLOW | WARN | Nonce ringbuffer overflow | Ignore it please, If CGMiner is restart, It will be ok. |
128 | CODE_MMCRCFAILED | WARN | Ignore it please, If CGMiner is restart, It will be ok. | Find iic rx crc mismatch |
256 | CODE_MCUCRCFAILED | WARN | Find mcu rx irc mismatch | Ignore it please, If CGMiner is restart, It will be ok. |
512 | CODE_NOFAN | FATAL | Fan cann't be found | Check the fan connection |
1024 | CODE_PG0FAILED | FATAL | Channel 0 power good failed | Check the PSU for channel 0 |
2048 | CODE_PG1FAILED | FATAL | Channel 1 power good failed | Check the PSU for channel 1 |
4096 | CODE_CORETESTFAILED | FATAL | Find bad chip on channel 0 or channel 1 | Replace a new hash unit if hash rate is too low, or else you can ignore it. |
8192 | CODE_ADC0_ERR | FATAL | Temperature sensor cann't be detected on channel 0 | Replace a new hash unit for channel 0 |
16384 | CODE_ADC1_ERR | FATAL | Temperature sensor cann't be detected on channel 1 | Replace a new hash unit for channel 1 |
32768 | CODE_VOL_ERR | FATAL | MM is not permit to run at the voltage for safety | Change another PSU for the machine |
TYPE meaning:
WARN-It designates potentially harmful situations, but you can ignore it. FATAL-It designates very severe error events that will presumably lead the Avalon6 to crash.
Firmware
RPi Firmware
20151225
- OpenWrt:Update to 15.05
- OpenWrt:Support Raspberry Pi 2 Model B
- LuCI:Sync with for-15.05 branch (ab31abd244979d1ff234a15a4a3cf69ac1b73688)
- CGMiner:Sync with ckolivas's master (5a456afbfa028162060afd66636b7cb266b35a53)
- CGMiner:Add more options for smartspeed (Only support MM version >= 601512-xxxxxxxx)
20151111
- CGMiner:Fix divide by zero in Avalon4 driver
- CGMiner:Add stratum difficulty in pool api
- CGMiner:Update option for Avalon6
- CGMiner:Update Vol api display in Avalon4 driver for Avalon6
- CGMiner:Update fan adjust for Avalon6
- CGMiner:Update target temp settting for Avalon6
- LuCI:Update display information for Avalon6
- LuCI:Update device name for Avalon6
- LuCI:Update CGMiner configuration for Avalon6
- LuCI:Update CGMiner setting for Avalon theme
20151031
- Fix nonce counter for multiple miners
- Display ASIC counts as TA in CGMiner status
- Update maximum difficulty for Avalon4 and Avalon6
- Update temperature check for Avalon6
- Add GHSmm for hash rate comparison
- Display PLL information for Avalon6
- Turn on nonce check as default for Avalon6
- Correct on voltage decode
- Enable adjust frequency automatically as default for Avalon6
- Decode voltage and temperature decode for Avalon6
- Support err code for Avalon6
20151001
- First version of Avalon6 firmware
NEXT-TESTING
- NOTICE: Only for testing
- Fix duplicate address
- Update GHS counter to fix the gap between miner and mm
- Add a new smart speed option
MM Firmware
2015-12-28
- Version 601512-57532250
- Fix:Don't touch fan by miner when mm is too hot
- Fix:Update idle process with toohot detect, stratum detect, and invalid mcu protect
- Fix:Fix coretest failed cause by incorrect pll setting
- Update:Update API_TIMEOUT_CONST
- Add:Support adjust freq by CGMiner when mm is working
2015-11-24
- Version 601511-f4f59c70
- Update Core test check rules
- Update Input voltage check rules (Input voltage should not >= 12.8V)
- Fix result when run test scripts
2015-11-11
- Version 601511-e3d244c0
- Add voltage range detect
- Check maximum rpm when detect fan polar
- Check temp for bad ntc resistor
- Check voltage when MM is starting
- Monitor powergood when power on
- Update temperature check
- Update nonce process
- Update frequency table
- Fix conflict address
- Enable 25MHz clock for debug purpose
- Disable pll when if miner is invalid when process FREQ_WORK
2015-10-31
- Version 601510-afa837a0
- Update IIC and UART communication
- Support core test by AVA4_P_TEST
- Update ASIC_FREQMIN to 100MHz
- Detect ASIC counts by LOOPBACK
- Fix upgrade failed caused by i2c FIFO overflow
- Update timer function
- Use GPIO led as address indicator
- Always disable the invalid miner when PG or LOOPBACK failed
- Add PLL status in P_STATUS_M
- Add err code
- Support ADC capture
- Keep free run if MCU can't be detected
- Update led status
- Rewrite boot loader with c code
2015-09-30
- Version 601509-a2613610
- First MM firmware for Avalon6.0 S
- Support 2 miners
- Detect asic counts when start
- Support target filter
NEXT-TESTING
- NOTICE: Only for testing
MCU Firmware
2015-10-31
- Version 6C1508-afa837a0
- For adc and temperature capture use MM protocal
AUC2 Firmware
20151208
- AUC version: AUC-20151208
- First release
NEXT-TESTING
- NOTICE: Only for testing
Software Development
Controller firmware
Daily building
CGMiner Under Ubuntu 14.04
#Inside your home directory, download Cgminer git clone https://github.com/Canaan-Creative/cgminer cd cgminer git checkout origin/avalon4 -b avalon4 ./autogen.sh --enable-avalon4 make -j 4 # Run sudo ./cgminer --avalon4-freq 200 --avalon4-voltage 7125 -o http://stratum.pool:3333 -u work -p pass or sudo ./cgminer --avalon4-freq 200 --avalon4-voltage 7125 -o http://stratum.pool:3333 -u work -p pass --api-allow W:192.168.2,W:192.168.2.1 --api-listen $@ 2>./log
Frequency Statechart
MM
Daily building
Avalon6 TB2
$ make -C firmware PLATFORM=MM60_TB2
Avalon6.0 S
$ make -C firmware
AUC2
Daily building
USB Bootloader
Support USB-DFU Mode
Using USB-DFU Protocol
Offset | Field | Size | Value | Descripton |
---|---|---|---|---|
0 | bLength | 1 | 12h | Size of this descriptor,in bytes. |
1 | bDescriptorType | 1 | 01h | DEVICE descriptor type. |
2 | bcdUSB | 2 | 0100h | USB specification release number in binary coded decimal. |
4 | bDeviceClass | 1 | 00h | See interface. |
5 | bDeviceSubClass | 1 | 00h | See interface |
6 | bDeviceProtocol | 1 | 00h | See interface. |
7 | bMaxPacketSize0 | 1 | 8,16,32,64 | Maximum packet size for endpoint. |
8 | idVendor | 2 | ID | Vendor ID. Assigned by the USB-IF. |
10 | idProduct | 2 | ID | Product ID. Assigned by manufacturer. |
12 | bcdDevice | 2 | BCD | Device release number in binary coded decimal. |
14 | iManufacturer | 1 | index | index of string descriptor. |
15 | iProduct | 1 | index | index of string descriptor. |
16 | iSerialNumber | 1 | index | index of string descriptor. |
17 | bNumConfigurations | 1 | 01h | One configuration only for DFU. |
Offset | Field | Size | Value | Descripton |
---|---|---|---|---|
0 | bLength | 1 | 09h | Size of this descriptor,in bytes. |
1 | bDescriptorType | 1 | 04h | INTERFACE descriptor type. |
2 | bInterfaceNumber | 1 | Number | Number of this interface. |
3 | bAlternateSetting | 1 | 00h | Alternate setting. Must be zero. |
4 | bNumEndpoints | 1 | 00h | Only the control pipe is used. |
5 | bInterfaceClass | 1 | FEh | Application Specific Class Code. |
6 | bInterfaceSubClass | 1 | 01h | Device Firmware Upgrade Code. |
7 | bInterfaceProtocol | 1 | 01h | Runtime protocol. |
8 | iInterface | 1 | index | Index of string descriptor for this interface. |
Offset | Field | Size | Value | Descripton |
---|---|---|---|---|
0 | bLength | 1 | 09h | Size of this descriptor,in bytes. |
1 | bDescriptorType | 1 | 21h | DFU FUNCTIONAL descriptor type. |
2 | bmAttributes | 1 | Bit mask | DFU attributes Bit 7……4: reserved Bit 3: device will perform a bus detach-attach sequence when it receives a DFU_DETACH request. The host must not issue a USB Reset. (bitWillDetach) 0 = no 1 = yes Bit 2: device is able to communicate via USB afeter Manifestation phase.(bitManifestationTolerant) 0 = no, must see bus reset 1 = yes Bit1: upload capable(bitCanUpload) 0 = no 1 = yes Bit0: download capable(bitCanDnload) 0 = no 1 = yes |
3 | wDetachTimeOut | 2 | Number | Time,in milliseconds, that the device will wait after receipt of the DFU_DETACH request. if this time elapses without a USB reaset, then the device will terminate the Reconfiguration phase and revert back to normal operation . This repreents the maximum time that the device can wait(depending on its timers, etc.).The host may specify a shorter timeout in the DFU_DETACH request. |
5 | wTransferSize | 2 | Number | Maximum number of bytes that the device can accept per control-write transaction. |
7 | bcdDFUVersion | 2 | BCD | Numeric expression identifying the version of the DFU Specification release. |
Offset | Field | Size | Value | Descripton |
---|---|---|---|---|
0 | bLength | 1 | 09h | Size of this descriptor,in bytes. |
1 | bDescriptorType | 1 | 04h | INTERFACE descriptor type. |
2 | bInterfaceNumber | 1 | Number | Number of this interface. |
3 | bAlternateSetting | 1 | 00h | Alternate setting. Must be zero. |
4 | bNumEndpoints | 1 | 00h | Only the control pipe is used. |
5 | bInterfaceClass | 1 | FEh | Application Specific Class Code. |
6 | bInterfaceSubClass | 1 | 01h | Device Firmware Upgrade Code. |
7 | bInterfaceProtocol | 1 | 02h | DFU mode protocol. |
8 | iInterface | 1 | index | Index of string descriptor for this interface. |
USB-DFU Product's USB Descriptor
DFU Updata Process Diagram
How To Judge The Bootloader Program Is Updating Or Jump To Application Program
I used a updata flag which is a four bytes word and is writed at fixd flash address (0x8000 - 4)
The flag's value is 0xAABBCCDD
When the bootloader program run, first it judge the updata flag, if the updata falg is not equal 0xAABBCCDD, it will jump to application program. Otherwise it will run to updata program.
How To Jump To Application Program
When we don't want to updata application program, the bootloader program should run to application program.
In order to achieve this goal, we can add under code in your bootloader program.
asm volatile("ldr r0, =0x4000"); //"the 0x4000 is my application program's MSP point, you must change it adapt to your" asm volatile("ldr r0, [r0]"); asm volatile("mov sp, r0"); asm volatile("ldr r0, =0x4004"); //"the 0x4004 is my application program reset-function entry address, you must change it adapt to your" asm volatile("ldr r0, [r0]"); asm volatile("mov pc, r0");
Modify dfu-util For Ubuntu 14.04
#Inside your home directory, download dfu-util
git clone git://git.openezx.org/dfu-util.git
open dfu-util/src/dfu_load.c
add this instruction "milli_sleep(200);" under line 134
cd dfu-util
./autogen.sh
./configure
make
The resulting binary is dfu-util/src/dfu-util.
Links
- See More About DFU Protocol
- Source Code
- USBD ROM Stack
- LPC11U1X User Manual
- LPCOpen sourcecode
- LPCOpen docs
- LPC11U14 Rev A Schematic
- Errata sheet LPC11U1x
- Using command line GDB
TODO
OpenWrt
- Support Raspberry Pi 2B
- Update with the master branch
- Support Avalon6 in LuCI (Advanced version)
- Keep more coding on LuCI (Avalon theme)
CGMiner
- Add auto speed option
- Merge the Avalon6 code to CK's master
MM
Known Issues
- MM can be upgrade by mismatch firmware.
- local hashrate (GHS av) cann't match with the pool's hashrate
- Use 5 or more modules in one AUC will cause MM idle periodically.
- Duplicate MM address
FAQ
1. How to deal with the red blinking machine?
2. How to boot the machine or hashboard unit safely?