Changeset 4776
- Timestamp:
- 11/10/08 11:59:31 (5 years ago)
- Location:
- developers/charlie/Tests/gsm
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
developers/charlie/Tests/gsm/test.py
r4760 r4776 3 3 # charlie@openmoko.org 4 4 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 7 This script will try to initialize the modem and then communicate with 8 it. The goal is to make it work with both the TI calypso and Siemens 9 MC75i modems. 10 """ 9 11 10 12 import time 11 13 import sys 14 import serial 12 15 13 EA = 0x01 14 CR = 0x02 15 SABM = 0x2f 16 PF = 0x10 17 CLD = 0xC1 16 import logging 17 logger = logging.getLogger('test') 18 18 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, 0xCF44 ]45 19 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() 20 def 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() 73 26 ret = '' 74 27 while True: 75 c = file.read(1)28 c = modem.read(1) 76 29 if not c: 77 30 break … … 79 32 if ret.endswith('\r\nOK\r\n'): 80 33 break 81 print "got reply : %s" % repr(ret)34 logger.debug("got reply : %s", repr(ret)) 82 35 return ret 83 36 84 # Where do those sleep times come from ? Shouldn't this be done in the85 # kernel anyway ? It there a way to make modem initialization hardware86 # 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)98 37 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) 38 def reset_calypso(): 39 """Initialize the modem before we can start sending AT commands 109 40 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) 120 56 121 57 58 def 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 79 def 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 92 def 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 106 USAGE = "test.py [device]" 107 108 if __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.
