comparison src/cs/drivers/drv_app/sim/sim.h @ 0:b6a5e36de839

src/cs: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:39:26 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:b6a5e36de839
1 /*
2 * SIM.H
3 *
4 * Pole Star SIM
5 *
6 * Target : ARM
7 *
8 * Copyright (c) Texas Instruments 1995-1997
9 *
10 */
11
12 /*
13 * Device addresses - GCS000 (Gemini / Polestar)
14 * HER207 (Hercules)
15 */
16
17 #ifndef _WINDOWS
18 #include "l1sw.cfg"
19 #include "chipset.cfg"
20 #endif
21
22 #include "nucleus.h"
23
24 /* Flags activation section */
25 // #define SIM_RETRY /* by default : NOT ACTIVE */
26 //#define SIM_DEBUG_TRACE /* by default : NOT ACTIVE */
27 //#define SIM_UWORD16_MASK 0x00ff //when using SIM entity not maped to length on 16 bits
28 #define SIM_UWORD16_MASK 0xffff //when using SIM entity maped to length on 16 bits
29 //#define SIM_APDU_TEST
30 //#define SIM_SAT_REFRESH_TEST
31
32 #define SIM_CMD (MEM_SIM + 0x00)
33 #define SIM_STAT (MEM_SIM + 0x02)
34 #define SIM_CONF1 (MEM_SIM + 0x04)
35 #define SIM_CONF2 (MEM_SIM + 0x06)
36 #define SIM_IT (MEM_SIM + 0x08)
37 #define SIM_DRX (MEM_SIM + 0x0A)
38 #define SIM_DTX (MEM_SIM + 0x0C)
39 #define SIM_MASK (MEM_SIM + 0x0E)
40
41
42
43 /*
44 * Bit definitions
45 */
46 // control regidter
47 #define SIM_CMD_CRST 0x0001
48 #define SIM_CMD_SWRST 0x0002
49 #define SIM_CMD_STOP 0x0004
50 #define SIM_CMD_START 0x0008
51 #define SIM_CMD_CLKEN 0x0010
52
53 // status register
54 #define SIM_STAT_CD 0x0001 // card present
55 #define SIM_STAT_TXPAR 0x0002 // transmit parity status
56 #define SIM_STAT_FFULL 0x0004 // fifo full
57 #define SIM_STAT_FEMPTY 0x0008 // fifo empty
58
59 // configuration register
60 #define SIM_CONF1_CHKPAR 0x0001 // enable receipt check parity
61 #define SIM_CONF1_CONV 0x0002 // coding convention
62 #define SIM_CONF1_TXRX 0x0004 // SIO line direction
63 #define SIM_CONF1_SCLKEN 0x0008 // enable SIM clock
64 #define SIM_CONF1_RSVD 0x0010 // reserved
65 #define SIM_CONF1_SCLKDIV 0x0020 // SIM clock frquency
66 #define SIM_CONF1_SCLKLEV 0x0040 // SIM clock idle level
67 #define SIM_CONF1_ETU 0x0080 // ETU period
68 #define SIM_CONF1_BYPASS 0x0100 // bypass hardware timers
69 #define SIM_CONF1_SVCCLEV 0x0200
70 #define SIM_CONF1_SRSTLEV 0x0400
71 #define SIM_CONF1_SIOLOW 0x8000 //force SIO to low level
72
73 // interrupt status register
74 #define SIM_IT_NATR 0x0001 // No answer to reset
75 #define SIM_IT_WT 0x0002
76 #define SIM_IT_ITOV 0x0004
77 #define SIM_IT_ITTX 0x0008 // Transmit
78 #define SIM_IT_ITRX 0x0010 // Receipt
79
80 #if ((CHIPSET == 4) || (CHIPSET == 5) || (CHIPSET == 6) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 9) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12))
81 #define SIM_IT_CD 0x0001 // Card insertion/extraction
82 #else
83 #define SIM_IT_CD 0x0020 // Card insertion/extraction
84 #endif
85
86 // interrupt mask register
87 #define SIM_MASK_NATR 0x0001 // No answer to reset
88 #define SIM_MASK_WT 0x0002
89 #define SIM_MASK_OV 0x0004
90 #define SIM_MASK_TX 0x0008 // Transmit
91 #define SIM_MASK_RX 0x0010 // Receipt
92 #define SIM_MASK_CD 0x0020 // Card insertion/extraction
93
94 // receveid byte register
95 #define SIM_DRX_STATRXPAR 0x0100 // received byte parity status
96
97 // SIM return code OK
98 #define SIM_OK 0
99
100 // SIM return error codes
101 #define SIM_ERR_NOCARD 1
102 #define SIM_ERR_NOINT 2
103 #define SIM_ERR_NATR 3
104 #define SIM_ERR_READ 4
105 #define SIM_ERR_XMIT 5
106 #define SIM_ERR_OVF 6
107 #define SIM_ERR_LEN 7
108 #define SIM_ERR_CARDREJECT 8
109 #define SIM_ERR_WAIT 9
110 #define SIM_ERR_ABNORMAL_CASE1 10
111 #define SIM_ERR_ABNORMAL_CASE2 11
112 #define SIM_ERR_BUFF_OVERFL 12
113
114 // begin of JYT modifications
115 #define SIM_ERR_HARDWARE_FAIL 13
116 // end of JYT modifications
117 #define SIM_ERR_RETRY_FAILURE 14
118
119 #define SIM_SLEEP_NONE 0 // No SIM available
120 #define SIM_SLEEP_DESACT 1 // The Driver is NOT currently in sleep mode (clock is off)
121 #define SIM_SLEEP_ACT 2 // The Driver is currently in sleep mode (clock is on)
122 #define SIM_SLEEP_NOT_ALLOWED 3 // The Driver cannot stop the clock :
123 // The card don't want or the interface is not able
124 // to do it.
125 #define SIM_SLEEP_WAITING_TIME 500 //represent 2.3s of period before entering in sleep mode
126
127 #define SIM_CLK_STOP_MASK 0x0D // Clock Stop mask defined by ETSI 11.11
128 #define SIM_CLK_STOP_NOT_ALLWD 0x00 // see ETSI 11.11 : Clock Stop never allowed
129 #define SIM_CLK_STOP_ALLWD 0x01 // see ETSI 11.11 : No prefered level
130 #define SIM_CLK_STOP_HIGH 0x04 // see ETSI 11.11 : High level only
131 #define SIM_CLK_STOP_LOW 0x08 // see ETSI 11.11 : Low level only
132
133 #if(ANLG_FAM == 1)
134 //OMEGA specific definitions
135 #define MODE5V_OMEGA 0x06 // used in SIM_SwitchVolt
136 #define MODE_INIT_OMEGA_3V 0x05 // used in SIM_StartVolt
137 #define MODE_INIT_OMEGA_5V 0x07 // unused !!!!
138 #define MODE3V_OMEGA 0x01 // unused !!!!
139 #define MODE_DIS_SIMLDOEN 0xDF // used in SIM_PowerOff
140 #define MODE_DIS_SIMEN 0xFD // used in SIM_PowerOff
141 #define MODE_ENA_SIMLDOEN 0x20 // used in SIM_ManualStart
142 #define MODE_ENA_SIMEN 0x02 // used in SIM_ManualStart
143 #elif(ANLG_FAM == 2)
144 //IOTA specific definitions
145 #define MODE1_8V_IOTA 0x00
146 #define MODE_INIT_IOTA_3V 0x03
147 #define MODE_INIT_IOTA_1_8V 0x02
148 #define MODE3V_IOTA 0x01
149 #define MODE_DIS_SIMLDOEN 0xFC // SIMSEL + Regulator RSIMEN
150 #define MODE_DIS_SIMEN 0xF7
151 #define MODE_ENA_SIMLDOEN 0x03 // SIMSEL + Regulator RSIMEN
152 #define MODE_ENA_SIMEN 0x08
153 #elif(ANLG_FAM == 3)
154 //SYREN specific definitions
155 #define MODE1_8V_SYREN 0x00
156 #define MODE_INIT_SYREN_3V 0x03
157 #define MODE_INIT_SYREN_1_8V 0x02
158 #define MODE3V_SYREN 0x01
159 #define MODE_DIS_SIMLDOEN 0x1FC // SIMSEL + Regulator RSIMEN
160 #define MODE_DIS_SIMEN 0x1F7
161 #define MODE_ENA_SIMLDOEN 0x03 // SIMSEL + Regulator RSIMEN
162 #define MODE_ENA_SIMEN 0x08
163 #endif
164
165 // define type of interface if not defined
166 // 5V only ME SIM_TYPE = 0
167 // 3V technology ME SIM_TYPE = 1
168 // 3V only ME SIM_TYPE = 2
169 // 1.8V technology ME SIM_TYPE = 3 // JYT, 29/01/02, from new specs IOTA
170 // 1.8V Only ME SIM_TYPE = 4 // JYT, 29/01/02, from new specs IOTA
171
172 #define SIM_TYPE_5V 0
173 #define SIM_TYPE_3_5V 1
174 #define SIM_TYPE_3V 2
175 #define SIM_TYPE_1_8_3V 3
176 #define SIM_TYPE_1_8V 4
177
178 //default configuration
179 #ifndef SIM_TYPE
180 #if((ANLG_FAM == 2) || (ANLG_FAM == 3))
181 // Until now (20/03/2003), it is impossible to test IOTA or SYREN with 1.8V Sim Card,
182 // so SIM drv is configured in 3V only with IOTA.and SYREN
183 // When 1.8V Sim Card will be delivered and tested on IOTA and SYREN, then Sim driver will pass
184 // to : #define SIM_TYPE SIM_TYPE_1_8_3V
185 #define SIM_TYPE SIM_TYPE_1_8_3V // MODIFY BY JENNIFER SIM_TYPE_3V
186 #else
187 #define SIM_TYPE SIM_TYPE_3_5V
188 #endif
189 #endif
190
191 // begin of modifications of JYT
192
193 #if((ANLG_FAM == 2) || (ANLG_FAM == 3))
194 #define SIM_MASK_INFO_VOLT 0x70
195 #else
196 #define SIM_MASK_INFO_VOLT 0x10
197 #endif
198
199 #define SIM_1_8V 0x30
200 #define SIM_3V 0x10
201 #define SIM_5V 0x00
202
203 // end of modifications of JYT
204
205 // Max size of Answer to Reset (GSM11.11 5.7.1)
206 #define MAX_ATR_SIZE 33
207
208 // GSM Instruction Class (GSM 11.11 SIM spec)
209 #define GSM_CLASS 0xA0
210
211 // SIM Instruction Codes
212 #define SIM_SELECT 0xA4
213 #define SIM_STATUS 0xF2
214 #define SIM_READ_BINARY 0xB0
215 #define SIM_UPDATE_BINARY 0xD6
216 #define SIM_READ_RECORD 0xB2
217 #define SIM_UPDATE_RECORD 0xDC
218 #define SIM_SEEK 0xA2
219 #define SIM_INCREASE 0x32
220 #define SIM_VERIFY_CHV 0x20
221 #define SIM_CHANGE_CHV 0x24
222 #define SIM_DISABLE_CHV 0x26
223 #define SIM_ENABLE_CHV 0x28
224 #define SIM_UNBLOCK_CHV 0x2C
225 #define SIM_INVALIDATE 0x04
226 #define SIM_REHABILITATE 0x44
227 #define SIM_RUN_GSM_ALGO 0x88
228 #define SIM_GET_RESPONSE 0xC0
229 #define SIM_TERMINAL_PROFILE 0x10
230 #define SIM_FETCH 0x12
231 #define SIM_TERMINAL_RESPONSE 0x14
232 #define SIM_ENVELOPE 0xC2
233
234
235
236 // SIM file identifiers
237 #define MF 0x3F00
238 #define EF_ICCID 0x2FE2
239 #define DF_GSM 0x7F20
240 #define DF_DCS1800 0x7F21
241 #define EF_LP 0x6F05
242 #define EF_IMSI 0x6F07
243 #define EF_KC 0x6F20
244 #define EF_PLMNSEL 0x6F30
245 #define EF_HPLMN 0x6F31
246 #define EF_ACMAX 0x6F37
247 #define EF_SST 0x6F38
248 #define EF_ACM 0x6F39
249 #define EF_PUCT 0x6F41
250 #define EF_CBMI 0x6F45
251 #define EF_BCCH 0x6F74
252 #define EF_ACC 0x6F78
253 #define EF_FPLMN 0x6F7B
254 #define EF_LOCI 0x6F7E
255 #define EF_AD 0x6FAD
256 #define EF_PHASE 0x6FAE
257 #define DF_TELECOM 0x7F10
258 #define EF_ADN 0x6F3A
259 #define EF_FDN 0x6F3B
260 #define EF_SMS 0x6F3C
261 #define EF_CCP 0x6F3D
262 #define EF_MSISDN 0x6F40
263 #define EF_SMSP 0x6F42
264 #define EF_SMSS 0x6F43
265 #define EF_LND 0x6F44
266 #define EF_EXT1 0x6F4A
267 #define EF_EXT2 0x6F4B
268 #define EF_ECC 0x6FB7
269
270
271 #define MASK_INS 0xFE
272 #define MASK_CMD 0x11
273 #define MASK_RST 0x10
274
275
276 // Buffer sizes
277 #define RSIMBUFSIZE 270
278 #define RSIZESW1SW2 2
279 #define XSIMBUFSIZE 270
280
281
282
283
284 // Structures
285 typedef struct
286 {
287 volatile unsigned short cmd;
288 volatile unsigned short stat;
289 volatile unsigned short conf1;
290 volatile unsigned short conf2;
291 volatile unsigned short it;
292 volatile unsigned short rx;
293 volatile unsigned short tx;
294 volatile unsigned short maskit;
295 #if ((CHIPSET == 4) || (CHIPSET == 5) || (CHIPSET == 6) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 9) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12))
296 volatile unsigned short it_cd;
297 #endif
298 } SIM_CONTROLLER;
299
300
301 typedef struct
302 {
303 SYS_UWORD8 Inverse;
304 SYS_UWORD8 AtrSize;
305 SYS_UWORD8 AtrData[MAX_ATR_SIZE];
306 } SIM_CARD;
307
308
309 typedef struct
310 {
311 SIM_CONTROLLER *c;
312 SYS_UWORD8 *xIn; // xmit input pointer
313 SYS_UWORD8 *xOut; // xmit output pointer
314 unsigned errorSIM; // code return in case of error detectd
315 unsigned short conf1; // image of the configuration register - avoids read/mod/write cycles
316 volatile unsigned short txParityErr;
317 unsigned short rxParityErr; // if 0 no parity error on receipt, 1 if...
318 SYS_UWORD8 Freq_Algo; //use to determine which sim clk freq to choose for running GSM algo
319 SYS_UWORD8 PTS_Try; //use to calculate how many PTS try were already done
320 SYS_UWORD8 FileC; //value of File Characteristic
321 SYS_UWORD16 etu9600;
322 SYS_UWORD16 etu400;
323 SYS_UWORD16 startclock; //744 clock cycle translated in ETU
324 SYS_UWORD16 stopclock; //1860 clock cycle translated in ETU
325 SYS_UWORD8 moderx; //inform that we are in receive mode
326 // 0 : mode of normal reception without procedure
327 // 1 : mode of wait for acknowledge during reception of char
328 // 2 : mode of reception of data by bloc
329 // 3 : mode of reception of data char by char (proc char)
330 // 4 : mode of reception of data char by char (data)
331 // 5 : mode of reception of procedure char SW1/SW2
332 // 6 : mode of wait for acknowledge char after transmission of char
333 SYS_UWORD16 expected_data; //number of expected char in receive mode proc char
334 SYS_UWORD8 ack; //acknowledge char
335 SYS_UWORD8 null_received; //indicates if a NULL char was received
336 SYS_UWORD8 hw_mask; //mask used because of pole112 hw prb
337
338 SYS_UWORD8 rbuf[RSIMBUFSIZE];
339 SYS_UWORD8 rx_index; // receive index on rbuf buffer
340
341 SYS_UWORD8 xbuf[XSIMBUFSIZE];
342 SYS_UWORD8 rSW12[RSIZESW1SW2]; //buffer to store SW1 and SW2
343 SYS_UWORD8 SWcount; //static counter
344 void (*InsertFunc)(SIM_CARD *);
345 void (*RemoveFunc)(void);
346 SYS_UWORD16 apdu_ans_length;
347 }
348 SIM_PORT;
349
350
351
352 void SIM_IntHandler(void);
353 #if ((CHIPSET == 4) || (CHIPSET == 5) || (CHIPSET == 6) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 9) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12))
354 void SIM_CD_IntHandler(void);
355 #endif
356
357
358
359
360
361 /*
362 * Prototypes
363 */
364 // obsolete function
365 void SIM_Init(void (Insert(SIM_CARD *cP)), void (Remove(void)));
366
367 // initialization
368 void SIM_Initialize(void);
369 SYS_UWORD16 SIM_Register(void (Insert(SIM_CARD *cP)), void (Remove(void)));
370 SYS_UWORD16 SIM_Reset(SIM_CARD *cP);
371 SYS_UWORD16 SIM_Restart(SIM_CARD *cP);
372
373 // file commands
374 SYS_UWORD16 SIM_Select(SYS_UWORD16 id, SYS_UWORD8 *dat, SYS_UWORD16 *size);
375 SYS_UWORD16 SIM_Status(SYS_UWORD8 *dat, SYS_UWORD16 *size);
376 SYS_UWORD16 SIM_ReadBinary(SYS_UWORD8 *dat, SYS_UWORD16 offset, SYS_UWORD16 len, SYS_UWORD16 *size);
377 SYS_UWORD16 SIM_UpdateBinary(SYS_UWORD8 *result, SYS_UWORD8 *dat, SYS_UWORD16 offset, SYS_UWORD16 len, SYS_UWORD16 *size);
378 SYS_UWORD16 SIM_ReadRecord(SYS_UWORD8 *dat, SYS_UWORD8 mode, SYS_UWORD8 recNum, SYS_UWORD16 len, SYS_UWORD16 *size);
379 SYS_UWORD16 SIM_UpdateRecord(SYS_UWORD8 *result, SYS_UWORD8 *dat, SYS_UWORD8 mode, SYS_UWORD8 recNum, SYS_UWORD16 len, SYS_UWORD16 *size);
380 SYS_UWORD16 SIM_Seek(SYS_UWORD8 *result, SYS_UWORD8 *dat, SYS_UWORD8 mode, SYS_UWORD16 len, SYS_UWORD16 *size);
381 SYS_UWORD16 SIM_Increase(SYS_UWORD8 *result, SYS_UWORD8 *dat, SYS_UWORD16 *size);
382
383 // Authentication
384 SYS_UWORD16 SIM_VerifyCHV(SYS_UWORD8 *result, SYS_UWORD8 *chv, SYS_UWORD8 chvType, SYS_UWORD16 *size);
385 SYS_UWORD16 SIM_ChangeCHV(SYS_UWORD8 *result,SYS_UWORD8 *oldChv, SYS_UWORD8 *newChv, SYS_UWORD8 chvType, SYS_UWORD16 *size);
386 SYS_UWORD16 SIM_DisableCHV(SYS_UWORD8 *result, SYS_UWORD8 *dat, SYS_UWORD16 *size);
387 SYS_UWORD16 SIM_EnableCHV(SYS_UWORD8 *result, SYS_UWORD8 *dat, SYS_UWORD16 *size);
388 SYS_UWORD16 SIM_UnblockCHV(SYS_UWORD8 *result, SYS_UWORD8 *unblockChv, SYS_UWORD8 *newChv, SYS_UWORD8 chvType, SYS_UWORD16 *size);
389
390 // managing
391 SYS_UWORD16 SIM_Invalidate(SYS_UWORD8 *rP, SYS_UWORD16 *size);
392 SYS_UWORD16 SIM_Rehabilitate(SYS_UWORD8 *rP, SYS_UWORD16 *size);
393 SYS_UWORD16 SIM_RunGSMAlgo(SYS_UWORD8 *result, SYS_UWORD8 *rand, SYS_UWORD16 *size);
394 SYS_UWORD16 SIM_GetResponse(SYS_UWORD8 *dat, SYS_UWORD16 len, SYS_UWORD16 *size);
395
396 // STK
397 SYS_UWORD16 SIM_TerminalProfile(SYS_UWORD8 *result, SYS_UWORD8 *dat, SYS_UWORD16 len, SYS_UWORD16 *rcvSize);
398 SYS_UWORD16 SIM_Fetch(SYS_UWORD8 *result, SYS_UWORD16 len, SYS_UWORD16 *rcvSize);
399 SYS_UWORD16 SIM_TerminalResponse(SYS_UWORD8 *result, SYS_UWORD8 *dat, SYS_UWORD16 len, SYS_UWORD16 *rcvSize);
400 SYS_UWORD16 SIM_Envelope(SYS_UWORD8 *result, SYS_UWORD8 *dat, SYS_UWORD16 len, SYS_UWORD16 *rcvSize);
401
402 // power off
403 void SIM_PowerOff(void);
404
405 // WIM
406 SYS_UWORD16 SIM_XchTPDU(SYS_UWORD8 *dat, SYS_UWORD16 trxLen, SYS_UWORD8 *result,
407 SYS_UWORD16 rcvLen, SYS_UWORD16 *rcvSize);
408
409 void SIM_lock_cr17689(void);
410
411
412
413 /*
414 * Internal Prototypes
415 */
416 void SIM_WriteBuffer(SIM_PORT *p, SYS_UWORD16 offset, SYS_UWORD16 n);
417 SYS_UWORD16 SIM_Result(SIM_PORT *p, SYS_UWORD8 *rP, SYS_UWORD16 *lenP, SYS_UWORD8 offset);
418 SYS_UWORD16 SIM_Command(SIM_PORT *p, SYS_UWORD16 n, SYS_UWORD8 *rP, SYS_UWORD16 *lP);
419 SYS_UWORD16 SIM_Command_Base(SIM_PORT *p, SYS_UWORD16 n, SYS_UWORD8 *dP, SYS_UWORD16 *lP);
420 SYS_UWORD16 SIM_Dummy(void);
421 void SIM_InitLog(void);
422
423 SYS_UWORD16 SIM_TxParityErrors();
424 SYS_UWORD16 SIM_WaitReception(SIM_PORT *p);
425 void SIM_Interpret_FileCharacteristics(SIM_PORT *p);
426 SYS_UWORD16 SIM_PTSprocedure(SIM_CARD *cP, SIM_PORT *p);
427 void SIM_WARMReset (SIM_PORT *p);
428 void SIM_SleepMode_In(SYS_UWORD32 param);
429 void SIM_SleepMode_Out(SIM_PORT *p);
430 SYS_UWORD8 SIM_GetFileCharacteristics(SIM_PORT *p);
431 SYS_UWORD16 SIM_ATRdynamictreatement (SIM_PORT *p, SIM_CARD *cP);
432 SYS_UWORD16 SIM_Waitforchars (SIM_PORT *p, SYS_UWORD16 max_wait);
433 void SIM_Calcetu (SIM_PORT *p);
434 SYS_UWORD8 SIM_Translate_atr_char (SYS_UWORD8 input, SIM_CARD *cP);
435
436
437 SYS_UWORD8 SIM_StartVolt (SYS_UWORD8 ResetFlag);
438 SYS_UWORD8 SIM_SwitchVolt (SYS_UWORD8 ResetFlag);
439
440 SYS_UWORD16 SIM_ManualStart (SIM_PORT *p);
441 SYS_UWORD8 SIM_Memcpy(SYS_UWORD8 *Buff_target, SYS_UWORD8 Buff_source[], SYS_UWORD16 len);
442 SYS_BOOL SIM_SleepStatus(void);
443 SYS_UWORD16 SIM_Reset_Restart_Internal(SIM_CARD *cP, SYS_UWORD8 ResetFlag);
444
445 /*
446 * Global variables
447 */
448 #ifdef SIM_C
449 #define SI_GLOBAL
450 #else
451 #define SI_GLOBAL extern
452 #endif
453
454
455 SI_GLOBAL SIM_PORT Sim[1];
456 SI_GLOBAL NU_TIMER SIM_timer;
457 SI_GLOBAL STATUS status_os_sim;
458 SI_GLOBAL SYS_UWORD8 SIM_sleep_status;
459