Changeset 4776


Ignore:
Timestamp:
11/10/08 10:59:31 (9 years ago)
Author:
charlie
Message:

Updated GSM modem test script

Location:
developers/charlie/Tests/gsm
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • developers/charlie/Tests/gsm/test.py

    r4760 r4776  
    33# charlie@openmoko.org 
    44 
    5 # This is just a test... Very ugly and un-pythonic structure... Please 
    6 # don't use it. The idea is to find a way to write hadware independant 
    7 # modem intialization, so the user space can start communicating with 
    8 # any GSM modem. I want to cover both TI Calypso and Siemens MC75i. 
     5"""GSM modem testing script 
     6 
     7This script will try to initialize the modem and then communicate with 
     8it. The goal is to make it work with both the TI calypso and Siemens 
     9MC75i modems. 
     10""" 
    911 
    1012import time 
    1113import sys 
     14import serial 
    1215 
    13 EA = 0x01 
    14 CR = 0x02 
    15 SABM = 0x2f 
    16 PF = 0x10 
    17 CLD = 0xC1 
     16import logging 
     17logger = logging.getLogger('test') 
    1818 
    19 crc_table = [ 
    20     0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 0x0E, 0x9F, 0xED, 
    21     0x7C, 0x09, 0x98, 0xEA, 0x7B, 0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 
    22     0xF8, 0x69, 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67, 0x38, 
    23     0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D, 0x36, 0xA7, 0xD5, 0x44, 
    24     0x31, 0xA0, 0xD2, 0x43, 0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 
    25     0x51, 0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F, 0x70, 0xE1, 
    26     0x93, 0x02, 0x77, 0xE6, 0x94, 0x05, 0x7E, 0xEF, 0x9D, 0x0C, 0x79, 
    27     0xE8, 0x9A, 0x0B, 0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19, 
    28     0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17, 0x48, 0xD9, 0xAB, 
    29     0x3A, 0x4F, 0xDE, 0xAC, 0x3D, 0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 
    30     0xA2, 0x33, 0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21, 0x5A, 
    31     0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F, 0xE0, 0x71, 0x03, 0x92, 
    32     0xE7, 0x76, 0x04, 0x95, 0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 
    33     0x9B, 0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89, 0xF2, 0x63, 
    34     0x11, 0x80, 0xF5, 0x64, 0x16, 0x87, 0xD8, 0x49, 0x3B, 0xAA, 0xDF, 
    35     0x4E, 0x3C, 0xAD, 0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3, 
    36     0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1, 0xCA, 0x5B, 0x29, 
    37     0xB8, 0xCD, 0x5C, 0x2E, 0xBF, 0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 
    38     0x74, 0xE5, 0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB, 0x8C, 
    39     0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9, 0x82, 0x13, 0x61, 0xF0, 
    40     0x85, 0x14, 0x66, 0xF7, 0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 
    41     0xDD, 0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3, 0xB4, 0x25, 
    42     0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1, 0xBA, 0x2B, 0x59, 0xC8, 0xBD, 
    43     0x2C, 0x5E, 0xCF 
    44 ] 
    4519 
    46 def calc_crc(msg): 
    47     fcs = 0xff 
    48     for c in msg: 
    49         fcs = crc_table[fcs ^ ord(c)] 
    50     return 0xff - fcs 
    51      
    52 def format_frame(s): 
    53     return ''.join(['%02X' % ord(c) for c in s]) 
    54  
    55 def send_frame(file, channel, data, type): 
    56     msg = chr(0xf9) * 2 
    57     print 'sending "%s"' % format_frame(msg) 
    58     print file.write(msg) 
    59     # Then we create the address field 
    60     address = EA | CR | (channel & 63) << 2 
    61     # The type field 
    62     msg = chr(address) + chr(type) 
    63     # CRC 
    64     crc = chr(calc_crc(msg)) 
    65     msg = '\x7e' + msg + crc + '\x7e' 
    66     print 'sending "%s"' % format_frame(msg) 
    67     print file.write(msg) 
    68      
    69 def chat(file, command): 
    70     print "sending : %s" % command 
    71     file.write('%s\n\r' % command) 
    72     file.flush() 
     20def chat(modem, command): 
     21    """Send a command to the modem and wait for a reply 
     22    """ 
     23    logger.debug("sending : %s", command) 
     24    modem.write('%s\r' % command) 
     25    modem.flush() 
    7326    ret = '' 
    7427    while True: 
    75         c = file.read(1) 
     28        c = modem.read(1) 
    7629        if not c: 
    7730            break 
     
    7932        if ret.endswith('\r\nOK\r\n'): 
    8033            break 
    81     print "got reply : %s" % repr(ret) 
     34    logger.debug("got reply : %s", repr(ret)) 
    8235    return ret 
    8336 
    84 # Where do those sleep times come from ? Shouldn't this be done in the 
    85 # kernel anyway ? It there a way to make modem initialization hardware 
    86 # independant ? 
    87 print "turn modem off" 
    88 open('/sys/devices/platform/neo1973-pm-gsm.0/power_on', 'w').write('0') 
    89 time.sleep(1) 
    90 print "turn modem on" 
    91 open('/sys/devices/platform/neo1973-pm-gsm.0/power_on', 'w').write('1') 
    92 time.sleep(1) 
    93 print "reset modem" 
    94 open('/sys/devices/platform/neo1973-pm-gsm.0/reset', 'w').write('1') 
    95 time.sleep(1) 
    96 open('/sys/devices/platform/neo1973-pm-gsm.0/reset', 'w').write('0') 
    97 time.sleep(4) 
    9837 
    99 # Connect to the serial port 
    100 import serial 
    101 modem = serial.Serial('/dev/ttySAC0', 115200, rtscts=1, timeout=1) 
    102 print "waiting for ready msg" 
    103 # The modem should send something after it is initialized... 
    104 rep = modem.read(256) 
    105 if not rep: 
    106     print "Error no msg" 
    107     sys.exit(-1) 
    108 print repr(rep) 
     38def reset_calypso(): 
     39    """Initialize the modem before we can start sending AT commands 
    10940 
    110 # We wake the modem up (?) Do we always have to do this ? 
    111 chat(modem, 'AT') 
    112  
    113 chat(modem, 'ATZ')              # reset 
    114 chat(modem, 'ATE0')             # echo off 
    115 chat(modem, 'AT+CGMR')          # get the firmware version 
    116 ret = chat(modem, 'AT+CLAC')          # get the list of AT commands 
    117  
    118 print 
    119 print ret 
     41    This part of the code is specific to TI calypso modem. Maybe we 
     42    should modify the kernel so that we don't have to do that in user 
     43    space. 
     44    """ 
     45    logger.debug("turn modem off") 
     46    open('/sys/devices/platform/neo1973-pm-gsm.0/power_on', 'w').write('0') 
     47    time.sleep(1) 
     48    logger.debug("turn modem on") 
     49    open('/sys/devices/platform/neo1973-pm-gsm.0/power_on', 'w').write('1') 
     50    time.sleep(1) 
     51    logger.debug("reset modem") 
     52    open('/sys/devices/platform/neo1973-pm-gsm.0/reset', 'w').write('1') 
     53    time.sleep(1) 
     54    open('/sys/devices/platform/neo1973-pm-gsm.0/reset', 'w').write('0') 
     55    time.sleep(4) 
    12056 
    12157 
     58def basic_tests(modem): 
     59    """Perform some basic tests that don't need a SIM card""" 
     60    # TODO: check the return values 
     61    chat(modem, 'AT+CMUX?')      # Multiplexing mode (error on calypso) 
     62    chat(modem, 'AT+CGMM')       # Model id 
     63    chat(modem, 'AT+CGMR')       # Firmware version 
     64    chat(modem, 'AT+CGMI')       # Manufacturer id 
     65    chat(modem, 'AT+IPR?')       # Bit rate 
     66    chat(modem, 'AT+ICF?')       # Character framing 
     67    chat(modem, 'ATS3?')         # Command line term 
     68    chat(modem, 'ATS4?')         # Response formating 
     69    chat(modem, 'ATS5?')         # Command line editing char 
     70    chat(modem, 'AT+ICF?')       # TE-TA char framing 
     71    chat(modem, 'AT+IFC?')       # Flow control (calypso != MC75i) 
     72    chat(modem, 'AT+CSCS?')      # Character set 
     73    chat(modem, 'AT+CFUN?')      # Phone functionalities 
     74    chat(modem, 'AT+CLAC')       # List of AT commands 
     75 
     76    chat(modem, 'AT+CSQ')       # Signal quality 
     77 
     78 
     79def basic_sim_test(modem): 
     80    """Some basic tests with the SIM, but not using the GSM network. 
     81    """ 
     82    chat(modem, 'AT+CIMI')      # IMSI 
     83    chat(modem, 'AT+CPIN?')     # SIM status (e.g 'READY', 'SIM PIN') 
     84    chat(modem, 'AT+CPBS?')     # Phonebook memory storage 
     85    chat(modem, 'AT+CPBS="SM"') 
     86    chat(modem, 'AT+CPBR=?')    # Phonebook entries range. May return 
     87                                # error on calypso if phonebook is 
     88                                # empty 
     89    # chat(modem, 'AT+CPBW=1,"01234",129,"hello"') 
     90 
     91 
     92def gsm_network_tests(modem): 
     93    """Some basic GSM network tests 
     94 
     95    We need to be allowed to register to a provider. 
     96    """ 
     97    chat(modem, 'AT+CFUN=1')    # Turn antenna on 
     98    chat(modem, 'AT+COPS=?')    # Find all providers 
     99    # On the calypso it returns nothing... 
     100    # TODO: check that at least one provider is available 
     101    chat(modem, 'AT+COPS=0')    # Register 
     102    # On the MC75i is returns OK and then try to register 
     103    chat(modem, 'AT+COPS?')     # See provider 
     104 
     105 
     106USAGE = "test.py [device]" 
     107 
     108if __name__ == '__main__': 
     109    # The first parameter is the name of the device 
     110    if len(sys.argv) == 2: 
     111        device = sys.argv[1] 
     112    elif len(sys.argv) == 1: 
     113        device = '/dev/ttySAC0' 
     114    else: 
     115        print USAGE 
     116        sys.exit(-1) 
     117 
     118    logging.basicConfig(level=logging.DEBUG, 
     119                        format='%(name)-8s %(levelname)-8s %(message)s') 
     120 
     121    logger.info("using device %s", device) 
     122 
     123#    reset_calypso() 
     124 
     125    modem = serial.Serial(device, 115200, rtscts=1, timeout=5) 
     126    logger.debug("waiting for ready msg") 
     127    # The modem should send something after it is initialized... 
     128    rep = modem.read(256) 
     129    if not rep: 
     130        logger.error("Error no msg") 
     131        # sys.exit(-1) 
     132    logger.debug("Ready message: %s", repr(rep)) 
     133 
     134    # We start by a AT command to wake up the modem 
     135    # (Probably only needed by TI Calypso) 
     136    chat(modem, 'AT') 
     137    chat(modem, 'ATE0')             # echo off 
     138    chat(modem, 'ATZ')              # reset 
     139    chat(modem, 'AT+CMEE=2')        # verbose error 
     140 
     141 
     142    # Perform some basic tests 
     143    basic_tests(modem) 
     144    basic_sim_test(modem) 
     145    gsm_network_tests(modem) 
     146 
     147    # turn off the modem 
     148    # XXX: only work with Siemens MC75i 
     149    # chat(modem, 'AT^SMSO') 
Note: See TracChangeset for help on using the changeset viewer.