You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
364 lines
6.8 KiB
364 lines
6.8 KiB
#include "ax8052.h"
|
|
#include "libmf.h"
|
|
#include "libmfflash.h"
|
|
#include "libmfcrc.h"
|
|
#include "libmfcalsector.h"
|
|
|
|
SFRX(REF, 0x7F16) /* Reference Tuning */
|
|
SFRX(POWCTRL0, 0x7F10) /* Power Control 0 */
|
|
SFRX(POWCTRL1, 0x7F11) /* Power Control 1 */
|
|
SFRX(ADCCALG00GAIN0, 0x7030) /* ADC Calibration Range 00 Gain Low Byte */
|
|
SFRX(ADCCALG00GAIN1, 0x7031) /* ADC Calibration Range 00 Gain High Byte */
|
|
SFRX(ADCCALG01GAIN0, 0x7032) /* ADC Calibration Range 01 Gain Low Byte */
|
|
SFRX(ADCCALG01GAIN1, 0x7033) /* ADC Calibration Range 01 Gain High Byte */
|
|
SFRX(ADCCALG10GAIN0, 0x7034) /* ADC Calibration Range 10 Gain Low Byte */
|
|
SFRX(ADCCALG10GAIN1, 0x7035) /* ADC Calibration Range 10 Gain High Byte */
|
|
SFRX(ADCCALTEMPGAIN0, 0x7038) /* ADC Calibration Temperature Gain Low Byte */
|
|
SFRX(ADCCALTEMPGAIN1, 0x7039) /* ADC Calibration Temperature Gain High Byte */
|
|
SFRX(ADCCALTEMPOFFS0, 0x703A) /* ADC Calibration Temperature Offset Low Byte */
|
|
SFRX(ADCCALTEMPOFFS1, 0x703B) /* ADC Calibration Temperature Offset High Byte */
|
|
|
|
#if defined(SDCC)
|
|
|
|
uint8_t flash_apply_calibration(void)
|
|
{
|
|
__asm
|
|
;; REF = 0x04;
|
|
mov dptr,#_REF
|
|
mov a,#0x04
|
|
movx @dptr,a
|
|
;; ADCTUNE1 = 0x06;
|
|
mov dptr,#_ADCTUNE1
|
|
mov a,#0x06
|
|
movx @dptr,a
|
|
;; check signature
|
|
mov dptr,#_flash_calsector
|
|
movx a,@dptr
|
|
xrl a,#0x80
|
|
jnz 00001$
|
|
inc dptr
|
|
movx a,@dptr
|
|
xrl a,#0xfe
|
|
jnz 00001$
|
|
inc dptr
|
|
movx a,@dptr
|
|
xrl a,#'C'
|
|
jnz 00001$
|
|
inc dptr
|
|
movx a,@dptr
|
|
xrl a,#'A'
|
|
jnz 00001$
|
|
inc dptr
|
|
movx a,@dptr
|
|
xrl a,#'L'
|
|
jnz 00001$
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r2,a
|
|
add a,#-26
|
|
jnc 00001$
|
|
inc dptr
|
|
mov r3,#0xff
|
|
mov r4,_IE
|
|
clr _EA
|
|
mov r5,_XPAGE
|
|
mov _XPAGE,dph
|
|
mov r0,dpl
|
|
mov dptr,#_crc_crc8ccitt_msbtable
|
|
00002$: movx a,@r0
|
|
inc r0
|
|
xrl a,r3
|
|
movc a,@a+dptr
|
|
mov r3,a
|
|
djnz r2,00002$
|
|
mov _XPAGE,r5
|
|
mov _IE,r4
|
|
xrl a,#0xf3
|
|
jz 00003$
|
|
;; error exit
|
|
00001$: mov dptr,#_ADCCALG00GAIN0
|
|
mov a,#14429 & 0xff
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,#14429 >> 8
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,#15873 & 0xff
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,#15873 >> 8
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,#16603 & 0xff
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,#16603 >> 8
|
|
movx @dptr,a
|
|
mov dptr,#_ADCCALTEMPGAIN0
|
|
mov a,#10407 & 0xff
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,#10407 >> 8
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,#5671 & 0xff
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,#5671 >> 8
|
|
movx @dptr,a
|
|
mov dptr,#_FRCOSCFREQ0
|
|
mov a,#2114 & 0xff
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,#2114 >> 8
|
|
movx @dptr,a
|
|
mov dptr,#_LPOSCCONFIG
|
|
movx a,@dptr
|
|
mov dptr,#_LPOSCFREQ0
|
|
jnb acc.6,00004$
|
|
mov a,#52779 & 0xff
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,#52779 >> 8
|
|
movx @dptr,a
|
|
mov dptr,#0
|
|
ret
|
|
00004$: mov a,#53443 & 0xff
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,#53443 >> 8
|
|
movx @dptr,a
|
|
mov dptr,#0
|
|
ret
|
|
|
|
;; restore calibration
|
|
;; POWCTRL0, POWCTRL1, REF
|
|
00003$: mov dptr,#(_flash_calsector + 0x001c)
|
|
movx a,@dptr
|
|
mov r0,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r1,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r2,a
|
|
mov dptr,#_POWCTRL0
|
|
mov a,r0
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r1
|
|
movx @dptr,a
|
|
mov dptr,#_REF
|
|
mov a,r2
|
|
movx @dptr,a
|
|
;; ADCCALGxxGAINy
|
|
mov dptr,#(_flash_calsector + 0x000c)
|
|
movx a,@dptr
|
|
mov r0,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r1,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r2,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r3,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r4,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r5,a
|
|
mov dptr,#_ADCCALG00GAIN0
|
|
mov a,r0
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r1
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r2
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r3
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r4
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r5
|
|
movx @dptr,a
|
|
;; ADCCALTEMPGAINx, ADCCALTEMPOFFSx
|
|
mov dptr,#(_flash_calsector + 0x0012)
|
|
movx a,@dptr
|
|
mov r0,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r1,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r2,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r3,a
|
|
mov a,r1
|
|
add a,#-20
|
|
jc 00005$
|
|
mov a,r1
|
|
rl a
|
|
rl a
|
|
anl a,#0xfc
|
|
mov r1,a
|
|
mov a,r0
|
|
rl a
|
|
rl a
|
|
mov r0,a
|
|
anl a,#0x03
|
|
orl a,r1
|
|
mov r1,a
|
|
mov a,r0
|
|
anl a,#0xfc
|
|
mov r0,a
|
|
mov a,r3
|
|
rl a
|
|
rl a
|
|
anl a,#0xfc
|
|
mov r3,a
|
|
mov a,r2
|
|
rl a
|
|
rl a
|
|
mov r2,a
|
|
anl a,#0x03
|
|
orl a,r3
|
|
mov r3,a
|
|
mov a,r2
|
|
anl a,#0xfc
|
|
mov r2,a
|
|
00005$: mov dptr,#_ADCCALTEMPGAIN0
|
|
mov a,r0
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r1
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r2
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r3
|
|
movx @dptr,a
|
|
;; FRCOSCFREQx
|
|
mov dptr,#(_flash_calsector + 0x0016)
|
|
movx a,@dptr
|
|
mov r0,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r1,a
|
|
mov dptr,#_FRCOSCFREQ0
|
|
mov a,r0
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r1
|
|
movx @dptr,a
|
|
;; LPOSCFREQx
|
|
mov dptr,#_LPOSCCONFIG
|
|
movx a,@dptr
|
|
mov dptr,#(_flash_calsector + 0x0018)
|
|
jnb acc.6,00006$
|
|
mov dptr,#(_flash_calsector + 0x001a)
|
|
00006$: movx a,@dptr
|
|
mov r0,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r1,a
|
|
mov dptr,#_LPOSCFREQ0
|
|
mov a,r0
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r1
|
|
movx @dptr,a
|
|
mov dptr,#1
|
|
__endasm;
|
|
}
|
|
|
|
#else
|
|
|
|
uint8_t flash_apply_calibration(void)
|
|
{
|
|
REF = 0x04;
|
|
ADCTUNE1 = 0x06;
|
|
if (flash_calsector.id[0] != 0x80) {
|
|
err:
|
|
ADCCALG00GAIN0 = 14429 & 0xff;
|
|
ADCCALG00GAIN1 = 14429 >> 8;
|
|
ADCCALG01GAIN0 = 15873 & 0xff;
|
|
ADCCALG01GAIN1 = 15873 >> 8;
|
|
ADCCALG10GAIN0 = 16603 & 0xff;
|
|
ADCCALG10GAIN1 = 16603 >> 8;
|
|
ADCCALTEMPGAIN0 = 10407 & 0xff;
|
|
ADCCALTEMPGAIN1 = 10407 >> 8;
|
|
ADCCALTEMPOFFS0 = 5671 & 0xff;
|
|
ADCCALTEMPOFFS1 = 5671 >> 8;
|
|
FRCOSCFREQ0 = 2114 & 0xff;
|
|
FRCOSCFREQ1 = 2114 >> 8;
|
|
if (LPOSCCONFIG & 0x40) {
|
|
LPOSCFREQ0 = 52779 & 0xff;
|
|
LPOSCFREQ1 = 52779 >> 8;
|
|
} else {
|
|
LPOSCFREQ0 = 53443 & 0xff;
|
|
LPOSCFREQ1 = 53443 >> 8;
|
|
}
|
|
return 0;
|
|
}
|
|
if (flash_calsector.id[1] != 0xfe)
|
|
goto err;
|
|
if (flash_calsector.id[2] != (uint8_t)'C')
|
|
goto err;
|
|
if (flash_calsector.id[3] != (uint8_t)'A')
|
|
goto err;
|
|
if (flash_calsector.id[4] != (uint8_t)'L')
|
|
goto err;
|
|
if (flash_calsector.len < (uint8_t)26)
|
|
goto err;
|
|
if (crc_crc8ccitt_msb((&flash_calsector.len) + 1, flash_calsector.len, 0xff) != 0xf3)
|
|
goto err;
|
|
POWCTRL0 = flash_calsector.powctrl0;
|
|
POWCTRL1 = flash_calsector.powctrl1;
|
|
REF = flash_calsector.ref;
|
|
ADCCALG00GAIN0 = flash_calsector.calg00gain[0];
|
|
ADCCALG00GAIN1 = flash_calsector.calg00gain[1];
|
|
ADCCALG01GAIN0 = flash_calsector.calg01gain[0];
|
|
ADCCALG01GAIN1 = flash_calsector.calg01gain[1];
|
|
ADCCALG10GAIN0 = flash_calsector.calg10gain[0];
|
|
ADCCALG10GAIN1 = flash_calsector.calg10gain[1];
|
|
{
|
|
uint8_t __autodata g0, g1, o0, o1;
|
|
g0 = flash_calsector.caltempgain[0];
|
|
g1 = flash_calsector.caltempgain[1];
|
|
o0 = flash_calsector.caltempoffs[0];
|
|
o1 = flash_calsector.caltempoffs[1];
|
|
if (g1 < 20) {
|
|
ADCCALTEMPGAIN0 = g0 << 2;
|
|
ADCCALTEMPGAIN1 = (g1 << 2) | (g0 >> 6);
|
|
ADCCALTEMPOFFS0 = o0 << 2;
|
|
ADCCALTEMPOFFS1 = (o1 << 2) | (o0 >> 6);
|
|
} else {
|
|
ADCCALTEMPGAIN0 = g0;
|
|
ADCCALTEMPGAIN1 = g1;
|
|
ADCCALTEMPOFFS0 = o0;
|
|
ADCCALTEMPOFFS1 = o1;
|
|
}
|
|
}
|
|
FRCOSCFREQ0 = flash_calsector.frcoscfreq[0];
|
|
FRCOSCFREQ1 = flash_calsector.frcoscfreq[1];
|
|
if (LPOSCCONFIG & 0x40) {
|
|
LPOSCFREQ0 = flash_calsector.lposcfreq_fast[0];
|
|
LPOSCFREQ1 = flash_calsector.lposcfreq_fast[1];
|
|
} else {
|
|
LPOSCFREQ0 = flash_calsector.lposcfreq[0];
|
|
LPOSCFREQ1 = flash_calsector.lposcfreq[1];
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
#endif
|