FreeCalypso > hg > fc-tourmaline
view src/cs/drivers/drv_core/inth/sys_inth.h @ 303:f76436d19a7a default tip
!GPRS config: fix long-standing AT+COPS chance hanging bug
There has been a long-standing bug in FreeCalypso going back years:
sometimes in the AT command bring-up sequence of an ACI-only MS,
the AT+COPS command would produce only a power scan followed by
cessation of protocol stack activity (only L1 ADC traces), instead
of the expected network search sequence. This behaviour was seen
in different FC firmware versions going back to Citrine, and seemed
to follow some law of chance, not reliably repeatable.
This bug has been tracked down and found to be specific to !GPRS
configuration, stemming from our TCS2/TCS3 hybrid and reconstruction
of !GPRS support that was bitrotten in TCS3.2/LoCosto version.
ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3
version and had to be pulled from TCS2 - but as it turns out,
there is a new field in the MMR_REG_REQ primitive that needs to be
set correctly, and that psa_mms.c module is the place where this
initialization needed to be added.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 08 Jun 2023 08:23:37 +0000 |
parents | 4e78acac3d88 |
children |
line wrap: on
line source
/* @(#) nom : sys_inth.h SID: 1.2 date : 05/23/03 */ /* Filename: sys_inth.h */ /* Version: 1.2 */ /****************************************************************************** * WIRELESS COMMUNICATION SYSTEM DEVELOPMENT * * (C) 2002 Texas Instruments France. All rights reserved * * Author : Francois AMAND * * * Important Note * -------------- * * This S/W is a preliminary version. It contains information on a product * under development and is issued for evaluation purposes only. Features * characteristics, data and other information are subject to change. * * The S/W is furnished under Non Disclosure Agreement and may be used or * copied only in accordance with the terms of the agreement. It is an offence * to copy the software in any way except as specifically set out in the * agreement. No part of this document may be reproduced or transmitted in any * form or by any means, electronic or mechanical, including photocopying and * recording, for any purpose without the express written permission of Texas * Instruments Inc. * ****************************************************************************** * * FILE NAME: sys_inth.h * * * PURPOSE: Header file for the Interrupt Handler Driver. * * * FILE REFERENCES: * * Name IO Description * ------------- -- --------------------------------------------- * * * * EXTERNAL VARIABLES: * * Source: * * Name Type IO Description * ------------- --------------- -- ------------------------------ * * * * EXTERNAL REFERENCES: * * Name Description * ------------------ ------------------------------------------------------- * * * * ABNORMAL TERMINATION CONDITIONS, ERROR AND WARNING MESSAGES: * * * * ASSUMPTION, CONSTRAINTS, RESTRICTIONS: * * * * NOTES: * * * * REQUIREMENTS/FUNCTIONAL SPECIFICATION REFERENCES: * * * * * DEVELOPMENT HISTORY: * * Date Name(s) Version Description * ----------- -------------- ------- ------------------------------------- * 11-Oct-2002 Francois AMAND 0.0.1 First implementation * * ALGORITHM: * * *****************************************************************************/ #include "l1sw.cfg" #include "chipset.cfg" #if (CHIPSET == 12) #ifndef __SYS_INTH_H__ #define __SYS_INTH_H__ #if (OP_L1_STANDALONE == 0) #include "main/sys_types.h" #else #include "sys_types.h" #endif #include "sys_map.h" /* * Driver version */ #define C_INTH_DRIVER_VERSION 0x0001 /* * Number of interrupts */ #define C_INTH_NUM_INT 32 #define C_INTH_2ND_NUM_INT 5 #define C_INTH_NB_INTERRUPT (C_INTH_NUM_INT + C_INTH_2ND_NUM_INT) /* * Main INTH : Interrupt bit numbers */ #define C_INTH_WATCHDOG_IT 0 #define C_INTH_TIMER1_IT 1 #define C_INTH_TIMER2_IT 2 #define C_INTH_TSP_RECEIVE_IT 3 #define C_INTH_FRAME_IT 4 #define C_INTH_PAGE_IT 5 #define C_INTH_SIM_IT 6 #define C_INTH_UART_MODEM1_IT 7 #define C_INTH_KEYBOARD_IT 8 #define C_INTH_RTC_TIMER_IT 9 #define C_INTH_RTC_ALARM_IT 10 #define C_INTH_ULPD_GAUGING_IT 11 #define C_INTH_ABB_IRQ_IT 12 #define C_INTH_SPIv 13 #define C_INTH_DMA_IT 14 #define C_INTH_API_IT 15 #define C_INTH_GPIO_IT 16 #define C_INTH_ABB_FIQ_IT 17 #define C_INTH_UART_IRDA_IT 18 #define C_INTH_TGSM_IT 19 #define C_INTH_GEA_IT 20 #define C_INTH_EXT_IRQ1_IT 21 #define C_INTH_EXT_IRQ2_IT 22 #define C_INTH_USIM_CD_IT 23 #define C_INTH_USIM_IT 24 #define C_INTH_LCD_IT 25 #define C_INTH_USB_IT 26 #define C_INTH_MMC_SD_MS_IT 27 #define C_INTH_UART_MODEM2_IT 28 #define C_INTH_2ND_INTH_IT 29 #define C_INTH_I2C_IT 30 #define C_INTH_NAND_FLASH_IT 31 /* * Second INTH : Interrupt bit numbers */ #define C_INTH_RNG_IT 32 #define C_INTH_SHA1_MD5_IT 33 #define C_INTH_EMPU_IT 34 #define C_INTH_SEC_DMA_IT 35 #define C_INTH_SEC_TIMER_IT 36 /* * Address of the Main interrupt handler registers */ #define C_INTH_IT_REG1 C_MAP_INTH_BASE /* INTH IT register 1 */ #define C_INTH_IT_REG2 (C_MAP_INTH_BASE + 0x02) /* INTH IT register 2 */ #define C_INTH_MASK_REG1 (C_MAP_INTH_BASE + 0x08) /* INTH mask register 1 */ #define C_INTH_MASK_REG2 (C_MAP_INTH_BASE + 0x0a) /* INTH mask register 2 */ #define C_INTH_B_IRQ_REG (C_MAP_INTH_BASE + 0x10) /* INTH source binary IRQ reg. */ #define C_INTH_B_FIQ_REG (C_MAP_INTH_BASE + 0x12) /* INTH source binary FIQ reg. */ #define C_INTH_CTRL_REG (C_MAP_INTH_BASE + 0x14) /* INTH control register */ #define C_INTH_EXT_REG (C_MAP_INTH_BASE + 0x20) /* INTH 1st external int. reg. */ /* * Address of the Second interrupt handler registers */ #define C_INTH2_IT_REG1 C_MAP_INTH_SEC_BASE /* INTH IT register 1 */ #define C_INTH2_MASK_REG1 (C_MAP_INTH_SEC_BASE + 0x08) /* INTH mask register 1 */ #define C_INTH2_B_IRQ_REG (C_MAP_INTH_SEC_BASE + 0x10) /* INTH source binary IRQ reg. */ #define C_INTH2_CTRL_REG (C_MAP_INTH_SEC_BASE + 0x14) /* INTH control register */ #define C_INTH2_EXT_REG (C_MAP_INTH_SEC_BASE + 0x20) /* INTH 1st external int. reg. */ /* * INTH_B_x_REG definition */ #define C_INTH_SRC_NUM 0x001f #define C_INTH2_SRC_NUM 0x0007 /* * ILR_IRQx_REG definition */ #define C_INTH_IRQ 0 #define C_INTH_FIQ 1 #define C_INTH_LEVEL 0 #define C_INTH_EDGE 1 /**************************************************************************** * MACRO DEFINITION ***************************************************************************/ /**************************************************************************** * * MACRO NAME: F_INTH_ENABLE_ONE_IT * Enable the interrupt specified in argument. * * * ARGUMENT LIST: * * Argument Description * ------------ ---------------------------------------------------------- * d_it Interrupt index * * RETURN VALUE: None * ***************************************************************************/ #define F_INTH_ENABLE_ONE_IT(d_it) { \ if (d_it < 16) \ * (volatile SYS_UWORD16 *) C_INTH_MASK_REG1 &= ~(1 << d_it); \ else if (d_it < C_INTH_NUM_INT) \ * (volatile SYS_UWORD16 *) C_INTH_MASK_REG2 &= ~(1 << (d_it-16)); \ else if (d_it < (C_INTH_NUM_INT + C_INTH_2ND_NUM_INT)) \ * (volatile SYS_UWORD16 *) C_INTH2_MASK_REG1 &= ~(1 << (d_it-32)); \ } /**************************************************************************** * * MACRO NAME: F_INTH_DISABLE_ONE_IT * Disable the interrupt specified in argument. * * * ARGUMENT LIST: * * Argument Description * ------------ ---------------------------------------------------------- * d_it Interrupt index * * RETURN VALUE: None * ***************************************************************************/ #define F_INTH_DISABLE_ONE_IT(d_it) { \ if (d_it < 16) \ * (volatile SYS_UWORD16 *) C_INTH_MASK_REG1 |= (1 << d_it); \ else if (d_it < C_INTH_NUM_INT) \ * (volatile SYS_UWORD16 *) C_INTH_MASK_REG2 |= (1 << (d_it-16)); \ else if (d_it < (C_INTH_NUM_INT + C_INTH_2ND_NUM_INT)) \ * (volatile SYS_UWORD16 *) C_INTH2_MASK_REG1 |= (1 << (d_it-32)); \ } /**************************************************************************** * * MACRO NAME: F_INTH_DISABLE_ALL_IT * Disable all interrupts. * * * ARGUMENT LIST: * * Argument Description * ------------ ---------------------------------------------------------- * * RETURN VALUE: None * ***************************************************************************/ #define F_INTH_DISABLE_ALL_IT { \ * (volatile SYS_UWORD16 *) C_INTH_MASK_REG1 = 0xffff; \ * (volatile SYS_UWORD16 *) C_INTH_MASK_REG2 = 0xffff; \ * (volatile SYS_UWORD16 *) C_INTH2_MASK_REG1 = 0x001f; \ } /**************************************************************************** * * MACRO NAME: F_INTH_RESET_ALL_IT * Reset all interrupts. * * * ARGUMENT LIST: * * Argument Description * ------------ ---------------------------------------------------------- * * RETURN VALUE: None * ***************************************************************************/ #define F_INTH_RESET_ALL_IT { \ * (volatile SYS_UWORD16 *) C_INTH_IT_REG1 &= 0x0000; \ * (volatile SYS_UWORD16 *) C_INTH_IT_REG2 &= 0x0000; \ * (volatile SYS_UWORD16 *) C_INTH2_IT_REG1 &= 0x0000; \ } /**************************************************************************** * * MACRO NAME: F_INTH_RESET_ONE_IT * Reset the interrupt specified in argument. * * * ARGUMENT LIST: * * Argument Description * ------------ ---------------------------------------------------------- * d_it Interrupt index * * RETURN VALUE: None * ***************************************************************************/ #define F_INTH_RESET_ONE_IT(d_it) { \ if (d_it < 16) \ * (volatile SYS_UWORD16 *) C_INTH_IT_REG1 &= ~(1 << d_it); \ else if (d_it < C_INTH_NUM_INT) \ * (volatile SYS_UWORD16 *) C_INTH_IT_REG2 &= ~(1 << (d_it-16)); \ else if (d_it < (C_INTH_NUM_INT + C_INTH_2ND_NUM_INT)) \ * (volatile SYS_UWORD16 *) C_INTH2_IT_REG1 &= ~(1 << (d_it-32)); \ } /**************************************************************************** * * MACRO NAME: F_INTH_VALID_NEXT * Valid next interrupt on the main interrupt handler. * * * ARGUMENT LIST: * * Argument Description * ------------ ---------------------------------------------------------- * d_fiq_nirq Source of the interrupt IRQ or FIQ * * RETURN VALUE: None * ***************************************************************************/ #define F_INTH_VALID_NEXT(d_fiq_nirq) * (volatile SYS_UWORD16 *) C_INTH_CTRL_REG |= (1 << d_fiq_nirq) /**************************************************************************** * * MACRO NAME: F_INTH2_VALID_NEXT * Valid next interrupt on the 2nd level interrupt handler. * * * ARGUMENT LIST: * * Argument Description * ------------ ---------------------------------------------------------- * d_fiq_nirq Source of the interrupt IRQ or FIQ. * * RETURN VALUE: None * ***************************************************************************/ #define F_INTH2_VALID_NEXT(d_fiq_nirq) * (volatile SYS_UWORD16 *) C_INTH2_CTRL_REG |= (1 << d_fiq_nirq) /**************************************************************************** * * MACRO NAME: F_INTH_GET_IRQ * Return pending IRQ interrupt index on the main interrupt handler. * * * ARGUMENT LIST: * * Argument Description * ------------ ---------------------------------------------------------- * * RETURN VALUE: IRQ interrupt index * ***************************************************************************/ #define F_INTH_GET_IRQ ((* (SYS_UWORD16 *) C_INTH_B_IRQ_REG) & C_INTH_SRC_NUM) /**************************************************************************** * * MACRO NAME: F_INTH_GET_FIQ * Return pending FIQ interrupt index on the main interrupt handler. * * * ARGUMENT LIST: * * Argument Description * ------------ ---------------------------------------------------------- * * RETURN VALUE: FIQ interrupt index * ***************************************************************************/ #define F_INTH_GET_FIQ ((* (SYS_UWORD16 *) C_INTH_B_FIQ_REG) & C_INTH_SRC_NUM) /**************************************************************************** * * MACRO NAME: F_INTH2_GET_IRQ * Return pending IRQ interrupt index on the 2nd level interrupt handler. * * * ARGUMENT LIST: * * Argument Description * ------------ ---------------------------------------------------------- * * RETURN VALUE: FIQ interrupt index * ***************************************************************************/ #define F_INTH2_GET_IRQ ((* (SYS_UWORD16 *) C_INTH2_B_IRQ_REG) & C_INTH2_SRC_NUM) /**************************************************************************** * STRUCTURE DEFINITION ***************************************************************************/ typedef struct { SYS_UWORD8 d_fiq_nirq; SYS_UWORD8 d_edge_nlevel; SYS_UWORD8 d_priority; SYS_FUNC d_it_handler; } T_INTH_CONFIG; /**************************************************************************** * GLOBAL VARIABLES REFERENCE ***************************************************************************/ extern SYS_FUNC a_inth_it_handlers[C_INTH_NUM_INT][2]; extern SYS_FUNC a_inth2_irq_handlers[C_INTH_2ND_NUM_INT]; /**************************************************************************** * PROTOTYPE DEFINITION ***************************************************************************/ /* * 16-BIS functions */ extern void f_inth_setup(T_INTH_CONFIG *p_inth_config); extern SYS_UWORD16 f_inth_get_version(void); /* * 32-BIS functions */ extern void f_inth_dummy(void); extern void f_inth_irq_handler(void); extern void f_inth_fiq_handler(void); extern void f_inth_2nd_level_handler(void); #endif /* __SYS_INTH_H__ */ #endif /* (CHIPSET == 12) */