that's how you set the channel
This commit is contained in:
parent
28e49b8a7d
commit
7ab82dd4ab
2 changed files with 101 additions and 8 deletions
16
doc/ws.dis
16
doc/ws.dis
|
@ -5309,14 +5309,14 @@ Disassembly of section P2:
|
|||
4030e8: 00ffffff .word 0x00ffffff
|
||||
|
||||
004030ec <SetChannel>:
|
||||
4030ec: b430 push {r4, r5}
|
||||
4030ec: b430 push {r4, r5} //r0 = chan_num r1=vcodivF r2=vcodivI
|
||||
4030ee: 4b1d ldr r3, [pc, #116] (403164 <GetCurrentChannel+0x38>)
|
||||
4030f0: 681c ldr r4, [r3, #0] //r4 = *0x80009800
|
||||
4030f2: 4d1d ldr r5, [pc, #116] (403168 <GetCurrentChannel+0x3c>) //0xbfffffff
|
||||
4030f4: 4025 ands r5, r4 // r5 = *0x80009800 & 0xbfffffff
|
||||
4030f6: 601d str r5, [r3, #0] // *0x80009800 = r5
|
||||
4030f8: 60d9 str r1, [r3, #12] // *0x80009800+12 = r3
|
||||
4030fa: 611a str r2, [r3, #16] // *0x80009800+12 = r2
|
||||
4030fa: 611a str r2, [r3, #16] // *0x80009800+16 = r2
|
||||
4030fc: 6b19 ldr r1, [r3, #48] // r1 = *0x80009800+48
|
||||
4030fe: 2202 movs r2, #2 // r2 = 2
|
||||
403100: 430a orrs r2, r1 // r2 = r1 | 2
|
||||
|
@ -6366,12 +6366,12 @@ Disassembly of section P2:
|
|||
403a38: e026 b.n 403a88 <??Subroutine2_0>
|
||||
|
||||
00403a3a <??MLMESetChannelRequest_0>:
|
||||
403a3a: 0081 lsls r1, r0, #2
|
||||
403a3c: 4a03 ldr r2, [pc, #12] (403a4c <??DataTable2>)
|
||||
403a3e: 5852 ldr r2, [r2, r1]
|
||||
403a40: 4903 ldr r1, [pc, #12] (403a50 <??DataTable3>)
|
||||
403a42: 5c09 ldrb r1, [r1, r0]
|
||||
403a44: f7ff fb52 bl 4030ec <SetChannel>
|
||||
403a3a: 0081 lsls r1, r0, #2 r0 is channel number, r1 is offset in words
|
||||
403a3c: 4a03 ldr r2, [pc, #12] (403a4c <??DataTable2>) r2=0x00403c14 (gaRFSynVCODivF_c)
|
||||
403a3e: 5852 ldr r2, [r2, r1] r2 gets gaRFSynVCODivF_c[r1]
|
||||
403a40: 4903 ldr r1, [pc, #12] (403a50 <??DataTable3>) r1=0x00403c04 (gaRFSynVCODivI_c)
|
||||
403a42: 5c09 ldrb r1, [r1, r0] r1 gets gaRFSynVCODivI_c[r1]
|
||||
403a44: f7ff fb52 bl 4030ec <SetChannel> // SetChannel(chan,gaRFSynVCODivF_c[chan],gaRFSynVCODivI_c[chan])
|
||||
403a48: 2000 movs r0, #0
|
||||
403a4a: e01d b.n 403a88 <??Subroutine2_0>
|
||||
|
||||
|
|
93
src/maca.c
93
src/maca.c
|
@ -248,6 +248,7 @@ const uint32_t AIMVAL[19] = {
|
|||
0x0004e3a0,
|
||||
};
|
||||
|
||||
/* tested and seems to be good */
|
||||
#define ADDR_POW1 0x8000a014
|
||||
#define ADDR_POW2 ADDR_POW1 + 12
|
||||
#define ADDR_POW3 ADDR_POW1 + 64
|
||||
|
@ -257,6 +258,98 @@ void set_power(uint8_t power) {
|
|||
reg(ADDR_POW3) = AIMVAL[power];
|
||||
}
|
||||
|
||||
const uint8_t VCODivI[4] = {
|
||||
0x2f2f2f2f,
|
||||
0x2f2f2f2f,
|
||||
0x3030302f,
|
||||
0x30303030,
|
||||
};
|
||||
|
||||
const uint8_t VCODivI[16] = {
|
||||
0x2f,
|
||||
0x2f,
|
||||
0x2f,
|
||||
0x2f,
|
||||
0x2f,
|
||||
0x2f,
|
||||
0x2f,
|
||||
0x2f,
|
||||
0x30,
|
||||
0x30,
|
||||
0x30,
|
||||
0x2f,
|
||||
0x30,
|
||||
0x30,
|
||||
0x30,
|
||||
0x30,
|
||||
};
|
||||
|
||||
const uint32_t VCODivF[16] = {
|
||||
0x00355555,
|
||||
0x006aaaaa,
|
||||
0x00a00000,
|
||||
0x00d55555,
|
||||
0x010aaaaa,
|
||||
0x01400000,
|
||||
0x01755555,
|
||||
0x01aaaaaa,
|
||||
0x01e00000,
|
||||
0x00155555,
|
||||
0x004aaaaa,
|
||||
0x00800000,
|
||||
0x00b55555,
|
||||
0x00eaaaaa,
|
||||
0x01200000,
|
||||
0x01555555,
|
||||
};
|
||||
|
||||
const uint8_t ctov_4c[16] = {
|
||||
0x0b,
|
||||
0x0b,
|
||||
0x0b,
|
||||
0x0a,
|
||||
0x0d,
|
||||
0x0d,
|
||||
0x0c,
|
||||
0x0c,
|
||||
0x0f,
|
||||
0x0e,
|
||||
0x0e,
|
||||
0x0e,
|
||||
0x11,
|
||||
0x10,
|
||||
0x10,
|
||||
0x0f,
|
||||
}
|
||||
|
||||
#define ADDR_CHAN1 0x80009800
|
||||
#define ADDR_CHAN2 ADDR_CHAN1+12
|
||||
#define ADDR_CHAN3 ADDR_CHAN1+16
|
||||
#define ADDR_CHAN4 ADDR_CHAN1+48
|
||||
void set_channel(uint8_t chan) {
|
||||
volatile uint32_t tmp;
|
||||
|
||||
tmp = reg(ADDR_CHAN1);
|
||||
tmp = tmp & 0xbfffffff;
|
||||
reg(ADDR_CHAN1) = tmp;
|
||||
|
||||
reg(ADDR_CHAN2) = VCODivF[chan];
|
||||
reg(ADDR_CHAN2) = VCODivI[chan];
|
||||
|
||||
tmp = reg(ADDR_CHAN4);
|
||||
tmp = tmp | 2;
|
||||
reg(ADDR_CHAN4) = tmp;
|
||||
|
||||
tmp = reg(ADDR_CHAN4);
|
||||
tmp = tmp | 4;
|
||||
reg(ADDR_CHAN4) = tmp;
|
||||
|
||||
tmp = tmp & 0xffffe0ff;
|
||||
tmp | ((ctov_4c[chan]<<8)&0x1F00);
|
||||
reg(ADDR_CHAN4) = tmp;
|
||||
/* duh! */
|
||||
}
|
||||
|
||||
/*
|
||||
* Do the ABORT-Wait-NOP-Wait sequence in order to prevent MACA malfunctioning.
|
||||
* This seqeunce is synchronous and no interrupts should be triggered when it is done.
|
||||
|
|
Loading…
Reference in a new issue