dect
/
linux-2.6
Archived
13
0
Fork 0

dect: coa: write BMC configuration when setting channel mode

Write the BMC configuration when setting the channel mode. This allows
to reserve memory for only a single configuration for both RX and TX.

Additionally it will in the future be used to configure S-field error
parameters dynamically.

Signed-off-by: Patrick McHardy <kaber@trash.net>
This commit is contained in:
Patrick McHardy 2011-04-20 01:37:18 +02:00
parent 34b95935ff
commit e783777ac8
4 changed files with 56 additions and 55 deletions

View File

@ -63,8 +63,7 @@
* 0x0e - 0x35: B-Field B-Field * 0x0e - 0x35: B-Field B-Field
* *
* 0x3a - 0x3e: Radio Cfg Radio Cfg * 0x3a - 0x3e: Radio Cfg Radio Cfg
* 0x40 - 0x47: BMC TX Cfg * 0x40 - 0x47: BMC Ctrl BMC Ctrl
* 0x48 - 0x4f: BMC RX Cfg
* 0x50 - 0x5f: DCS IV/Key DCS IV/Key * 0x50 - 0x5f: DCS IV/Key DCS IV/Key
* 0x70 - 0x7b: DCS state DCS state * 0x70 - 0x7b: DCS state DCS state
*/ */
@ -591,6 +590,42 @@ static void sc1442x_lock(const struct dect_transceiver *trx, u8 slot)
sc1442x_unlock_mem(dev); sc1442x_unlock_mem(dev);
} }
static void sc1442x_write_bmc_config(const struct coa_device *dev,
u8 slot, bool tx)
{
u16 off;
u8 cfg;
off = sc1442x_slot_offset(slot) + BMC_CTRL;
cfg = 2 << SC1442X_BC0_S_ERR_SHIFT;
cfg |= SC1442X_BC0_INV_TDO;
cfg |= SC1442X_BC0_SENS_A;
if (slot < 12 && !tx)
cfg |= SC1442X_BC0_PP_MODE;
sc1442x_dwriteb(dev, off + 0, cfg);
/* S-field error mask */
sc1442x_dwriteb(dev, off + 1, 0);
/* S-field sliding window error mask */
sc1442x_dwriteb(dev, off + 2, 0x3f);
/* DAC output */
sc1442x_dwriteb(dev, off + 3, 0);
cfg = SC1442X_BC4_ADP;
cfg |= 0xf & SC1442X_BC4_WIN_MASK;
cfg |= 0x80;
sc1442x_dwriteb(dev, off + 4, cfg);
cfg = SC1442X_BC5_DO_FR;
cfg |= tx ? SC1442X_BC5_TDO_DIGITAL : SC1442X_BC5_TDO_POWER_DOWN;
sc1442x_dwriteb(dev, off + 5, cfg);
/* Frame number */
sc1442x_dwriteb(dev, off + 6, 0);
}
static void sc1442x_set_mode(const struct dect_transceiver *trx, static void sc1442x_set_mode(const struct dect_transceiver *trx,
const struct dect_channel_desc *chd, const struct dect_channel_desc *chd,
enum dect_slot_states mode) enum dect_slot_states mode)
@ -618,6 +653,9 @@ static void sc1442x_set_mode(const struct dect_transceiver *trx,
sc1442x_write_cmd(dev, slottable[slot] + 0, WT, 1); sc1442x_write_cmd(dev, slottable[slot] + 0, WT, 1);
sc1442x_write_cmd(dev, slottable[slot] + 1, JMP, sc1442x_write_cmd(dev, slottable[slot] + 1, JMP,
sc1442x_rx_funcs[chd->pkt][chd->b_fmt][cipher][sync]); sc1442x_rx_funcs[chd->pkt][chd->b_fmt][cipher][sync]);
sc1442x_switch_to_bank(dev, sc1442x_slot_bank(slot));
sc1442x_write_bmc_config(dev, slot, false);
break; break;
case DECT_SLOT_TX: case DECT_SLOT_TX:
sc1442x_write_cmd(dev, slottable[prev] + 0, BK_C, sc1442x_write_cmd(dev, slottable[prev] + 0, BK_C,
@ -626,6 +664,9 @@ static void sc1442x_set_mode(const struct dect_transceiver *trx,
sc1442x_write_cmd(dev, slottable[slot] + 0, WT, 1); sc1442x_write_cmd(dev, slottable[slot] + 0, WT, 1);
sc1442x_write_cmd(dev, slottable[slot] + 1, JMP, sc1442x_write_cmd(dev, slottable[slot] + 1, JMP,
sc1442x_tx_funcs[chd->pkt][chd->b_fmt][cipher]); sc1442x_tx_funcs[chd->pkt][chd->b_fmt][cipher]);
sc1442x_switch_to_bank(dev, sc1442x_slot_bank(slot));
sc1442x_write_bmc_config(dev, slot, true);
break; break;
} }
sc1442x_unlock_mem(dev); sc1442x_unlock_mem(dev);
@ -672,7 +713,7 @@ static void sc1442x_tx(const struct dect_transceiver *trx, struct sk_buff *skb)
sc1442x_to_dmem(dev, off + SD_PREAMBLE_OFF, sc1442x_to_dmem(dev, off + SD_PREAMBLE_OFF,
skb_mac_header(skb), skb->mac_len); skb_mac_header(skb), skb->mac_len);
sc1442x_to_dmem(dev, off + SD_DATA_OFF, skb->data, skb->len); sc1442x_to_dmem(dev, off + SD_DATA_OFF, skb->data, skb->len);
sc1442x_dwriteb(dev, off + BMC_TX_CTRL + BMC_CTRL_MFR_OFF, cb->frame); sc1442x_dwriteb(dev, off + BMC_CTRL + BMC_CTRL_MFR_OFF, cb->frame);
/* Init DCS for slots in the first half frame */ /* Init DCS for slots in the first half frame */
if (ts->flags & DECT_SLOT_CIPHER && slot < DECT_HALF_FRAME_SIZE) if (ts->flags & DECT_SLOT_CIPHER && slot < DECT_HALF_FRAME_SIZE)
@ -835,7 +876,7 @@ out:
dect_transceiver_record_rssi(event, slot, rssi); dect_transceiver_record_rssi(event, slot, rssi);
/* Update frame number for next reception */ /* Update frame number for next reception */
sc1442x_dwriteb(dev, off + BMC_RX_CTRL + BMC_CTRL_MFR_OFF, framenum + 1); sc1442x_dwriteb(dev, off + BMC_CTRL + BMC_CTRL_MFR_OFF, framenum + 1);
/* Init DCS for slots in the first half frame */ /* Init DCS for slots in the first half frame */
if (ts->flags & DECT_SLOT_CIPHER && slot < DECT_HALF_FRAME_SIZE) if (ts->flags & DECT_SLOT_CIPHER && slot < DECT_HALF_FRAME_SIZE)
@ -879,47 +920,12 @@ out:
} }
EXPORT_SYMBOL_GPL(sc1442x_interrupt); EXPORT_SYMBOL_GPL(sc1442x_interrupt);
static void sc1442x_write_bmc_config(const struct coa_device *dev,
u16 off, bool pp, bool tx)
{
u8 cfg;
cfg = 2 << SC1442X_BC0_S_ERR_SHIFT;
cfg |= SC1442X_BC0_INV_TDO;
cfg |= SC1442X_BC0_SENS_A;
if (pp && !tx)
cfg |= SC1442X_BC0_PP_MODE;
sc1442x_dwriteb(dev, off + 0, cfg);
/* S-field error mask */
sc1442x_dwriteb(dev, off + 1, 0);
/* S-field sliding window error mask */
sc1442x_dwriteb(dev, off + 2, 0x3f);
/* DAC output */
sc1442x_dwriteb(dev, off + 3, 0);
cfg = SC1442X_BC4_ADP;
cfg |= 0xf & SC1442X_BC4_WIN_MASK;
cfg |= 0x80;
sc1442x_dwriteb(dev, off + 4, cfg);
cfg = SC1442X_BC5_DO_FR;
cfg |= tx ? SC1442X_BC5_TDO_DIGITAL : SC1442X_BC5_TDO_POWER_DOWN;
sc1442x_dwriteb(dev, off + 5, cfg);
/* Frame number */
sc1442x_dwriteb(dev, off + 6, 0);
}
static void sc1442x_init_slot(const struct coa_device *dev, u8 slot) static void sc1442x_init_slot(const struct coa_device *dev, u8 slot)
{ {
u16 off; u16 off;
sc1442x_switch_to_bank(dev, sc1442x_slot_bank(slot)); sc1442x_switch_to_bank(dev, sc1442x_slot_bank(slot));
off = sc1442x_slot_offset(slot); off = sc1442x_slot_offset(slot);
sc1442x_write_bmc_config(dev, off + BMC_TX_CTRL, slot < 12, true);
sc1442x_write_bmc_config(dev, off + BMC_RX_CTRL, slot < 12, false);
dev->radio_ops->rx_init(dev, off); dev->radio_ops->rx_init(dev, off);
dev->radio_ops->tx_init(dev, off); dev->radio_ops->tx_init(dev, off);
} }
@ -987,7 +993,7 @@ int sc1442x_init_device(struct coa_device *dev)
for (i = 1; i < SC1442X_CC_SIZE; i++) for (i = 1; i < SC1442X_CC_SIZE; i++)
sc1442x_dwriteb(dev, DIP_CC_INIT + i, 0); sc1442x_dwriteb(dev, DIP_CC_INIT + i, 0);
sc1442x_write_bmc_config(dev, BMC_CTRL_INIT, false, false); sc1442x_write_bmc_config(dev, 0, false);
for (slot = 0; slot < DECT_FRAME_SIZE; slot += 2) for (slot = 0; slot < DECT_FRAME_SIZE; slot += 2)
sc1442x_init_slot(dev, slot); sc1442x_init_slot(dev, slot);

View File

@ -34,8 +34,6 @@ BANK6_HIGH EQU 0xd0
BANK7_LOW EQU 0xe0 BANK7_LOW EQU 0xe0
BANK7_HIGH EQU 0xf0 BANK7_HIGH EQU 0xf0
BMC_CTRL_INIT EQU 0x00
; Codec Control ; Codec Control
DIP_CC_INIT EQU 0x10 DIP_CC_INIT EQU 0x10
@ -44,8 +42,7 @@ RF_DESC EQU 0x3a
; BMC control information ; BMC control information
BMC_CTRL_SIZE EQU 7 BMC_CTRL_SIZE EQU 7
BMC_TX_CTRL EQU 0x40 BMC_CTRL EQU 0x40
BMC_RX_CTRL EQU 0x48
; (multi) frame number for scambler and DCS ; (multi) frame number for scambler and DCS
BMC_CTRL_MFR_OFF EQU 6 BMC_CTRL_MFR_OFF EQU 6
@ -225,7 +222,7 @@ label_58: B_RST
; (93 bits total) ; (93 bits total)
; ;
Receive: B_RST Receive: B_RST
B_RC BMC_RX_CTRL B_RC BMC_CTRL
WT BMC_CTRL_SIZE + 1 WT BMC_CTRL_SIZE + 1
P_LDH PB_RX_ON P_LDH PB_RX_ON
P_LDL PB_RSSI ; enable RSSI measurement P_LDL PB_RSSI ; enable RSSI measurement
@ -247,7 +244,7 @@ ClockSyncOff: P_SC 0x00 ; | p: 30 S: 46
RTN ; Return | p: 93 A: 61 RTN ; Return | p: 93 A: 61
ReceiveSync: B_RST ReceiveSync: B_RST
B_RC BMC_RX_CTRL B_RC BMC_CTRL
WT BMC_CTRL_SIZE + 1 WT BMC_CTRL_SIZE + 1
P_LDH PB_RX_ON P_LDH PB_RX_ON
P_LDL PB_RSSI ; enable RSSI measurement P_LDL PB_RSSI ; enable RSSI measurement
@ -285,7 +282,7 @@ ReceiveEnd: P_LDH PB_RSSI ; |
Transmit: P_LDH 0x00 ; Transmit: P_LDH 0x00 ;
WT 40 ; WT 40 ;
B_RST ; B_RST ;
B_RC BMC_TX_CTRL ; B_RC BMC_CTRL ;
WNT 1 ; Wait until beginning of slot WNT 1 ; Wait until beginning of slot
B_ST 0x00 ; Start transmission of S-field data | B_ST 0x00 ; Start transmission of S-field data |
WT 1 ; Wait one bit | p: -8 S: 0 WT 1 ; Wait one bit | p: -8 S: 0
@ -411,7 +408,7 @@ InitDIP: ;B_RST
BK_C BANK0_LOW BK_C BANK0_LOW
C_LD DIP_CC_INIT C_LD DIP_CC_INIT
WT 10 WT 10
B_RC BMC_CTRL_INIT B_RC BMC_CTRL
WT BMC_CTRL_SIZE + 1 WT BMC_CTRL_SIZE + 1
B_RST B_RST
;C_ON ;C_ON
@ -424,7 +421,7 @@ RFStart: BR SyncInit
;------------------------------------------------------------- ;-------------------------------------------------------------
SHARED DIP_CC_INIT,RF_DESC SHARED DIP_CC_INIT,RF_DESC
SHARED BMC_CTRL_INIT,BMC_RX_CTRL,BMC_TX_CTRL,BMC_CTRL_MFR_OFF SHARED BMC_CTRL,BMC_CTRL_MFR_OFF
SHARED SD_RSSI_OFF,SD_CSUM_OFF,SD_PREAMBLE_OFF,SD_DATA_OFF SHARED SD_RSSI_OFF,SD_CSUM_OFF,SD_PREAMBLE_OFF,SD_DATA_OFF
SHARED SlotTable SHARED SlotTable

View File

@ -33,13 +33,13 @@ const unsigned char sc1442x_firmware[] = {
0x02, 0xa8, 0x01, 0x67, 0x39, 0x00, 0x09, 0x06, 0x02, 0xa8, 0x01, 0x67, 0x39, 0x00, 0x09, 0x06,
0x20, 0x00, 0xec, 0x50, 0x09, 0x05, 0x08, 0x01, 0x20, 0x00, 0xec, 0x50, 0x09, 0x05, 0x08, 0x01,
0x04, 0x00, 0x39, 0x00, 0x09, 0x06, 0x20, 0x00, 0x04, 0x00, 0x39, 0x00, 0x09, 0x06, 0x20, 0x00,
0xec, 0x50, 0x04, 0x00, 0x20, 0x00, 0x33, 0x48, 0xec, 0x50, 0x04, 0x00, 0x20, 0x00, 0x33, 0x40,
0x09, 0x08, 0xed, 0x40, 0xec, 0x01, 0x09, 0x19, 0x09, 0x08, 0xed, 0x40, 0xec, 0x01, 0x09, 0x19,
0x08, 0x01, 0x09, 0x08, 0x27, 0x00, 0xea, 0x20, 0x08, 0x01, 0x09, 0x08, 0x27, 0x00, 0xea, 0x20,
0xed, 0x02, 0x09, 0x05, 0x29, 0x00, 0x2c, 0x00, 0xed, 0x02, 0x09, 0x05, 0x29, 0x00, 0x2c, 0x00,
0x09, 0x0c, 0xec, 0x02, 0x09, 0x20, 0xea, 0x00, 0x09, 0x0c, 0xec, 0x02, 0x09, 0x20, 0xea, 0x00,
0x3f, 0x06, 0x09, 0x3e, 0x04, 0x00, 0x20, 0x00, 0x3f, 0x06, 0x09, 0x3e, 0x04, 0x00, 0x20, 0x00,
0x33, 0x48, 0x09, 0x08, 0xed, 0x40, 0xec, 0x01, 0x33, 0x40, 0x09, 0x08, 0xed, 0x40, 0xec, 0x01,
0x09, 0x19, 0x08, 0x01, 0x09, 0x08, 0x27, 0x00, 0x09, 0x19, 0x08, 0x01, 0x09, 0x08, 0x27, 0x00,
0xea, 0x20, 0xed, 0x02, 0x09, 0x05, 0x29, 0x00, 0xea, 0x20, 0xed, 0x02, 0x09, 0x05, 0x29, 0x00,
0x2c, 0x00, 0x09, 0x0c, 0xec, 0x02, 0x09, 0x20, 0x2c, 0x00, 0x09, 0x0c, 0xec, 0x02, 0x09, 0x20,
@ -68,6 +68,6 @@ const unsigned char sc1442x_firmware[] = {
0x03, 0xed, 0x20, 0x00, 0x6b, 0x00, 0x08, 0x17, 0x03, 0xed, 0x20, 0x00, 0x6b, 0x00, 0x08, 0x17,
0x01, 0xdf, 0x08, 0x17, 0xea, 0x00, 0x02, 0x38, 0x01, 0xdf, 0x08, 0x17, 0xea, 0x00, 0x02, 0x38,
0x61, 0x00, 0x08, 0x16, 0x01, 0xdf, 0x0f, 0x00, 0x61, 0x00, 0x08, 0x16, 0x01, 0xdf, 0x0f, 0x00,
0xfa, 0x10, 0x09, 0x0a, 0x33, 0x00, 0x09, 0x08, 0xfa, 0x10, 0x09, 0x0a, 0x33, 0x40, 0x09, 0x08,
0x20, 0x00, 0x09, 0x0a, 0xe9, 0x00, 0xe8, 0x04, 0x20, 0x00, 0x09, 0x0a, 0xe9, 0x00, 0xe8, 0x04,
0x62, 0x00, 0x0b, 0x00, 0x01, 0xde}; 0x62, 0x00, 0x0b, 0x00, 0x01, 0xde};

View File

@ -5,9 +5,7 @@ extern const unsigned char sc1442x_firmware[510];
#define DIP_CC_INIT 0x10 #define DIP_CC_INIT 0x10
#define RF_DESC 0x3A #define RF_DESC 0x3A
#define BMC_CTRL_INIT 0x0 #define BMC_CTRL 0x40
#define BMC_RX_CTRL 0x48
#define BMC_TX_CTRL 0x40
#define BMC_CTRL_MFR_OFF 0x6 #define BMC_CTRL_MFR_OFF 0x6
#define SD_RSSI_OFF 0x0 #define SD_RSSI_OFF 0x0
#define SD_CSUM_OFF 0x1 #define SD_CSUM_OFF 0x1