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.
CubeSatSim/libs/libmf/source/flashcal.c

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

Powered by TurnKey Linux.