Changeset 7bdcc45 in mainline for uspace/app/tester/hw/serial/serial1.c
- Timestamp:
- 2010-12-16T16:38:49Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 7837101
- Parents:
- 8e58f94 (diff), eb221e5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/tester/hw/serial/serial1.c
r8e58f94 r7bdcc45 27 27 */ 28 28 29 /** @addtogroup test _serial30 * @brief test the serial port driver - read from the serial port29 /** @addtogroup tester 30 * @brief Test the serial port driver - loopback test 31 31 * @{ 32 32 */ … … 35 35 */ 36 36 37 #include <inttypes.h> 37 38 #include <errno.h> 38 39 #include <stdlib.h> … … 47 48 #include <str.h> 48 49 #include <ipc/serial_ctl.h> 49 50 #define NAME "test serial" 51 52 53 static void print_usage(void) 50 #include "../../tester.h" 51 52 #define DEFAULT_COUNT 1024 53 #define DEFAULT_SLEEP 100000 54 #define EOT "####> End of transfer <####\n" 55 56 const char *test_serial1(void) 54 57 { 55 printf("Usage: \n test_serial count \n where count is the number of " 56 "characters to be read\n"); 57 } 58 59 int main(int argc, char *argv[]) 60 { 61 if (argc != 2) { 62 printf(NAME ": incorrect number of arguments.\n"); 63 print_usage(); 64 return 0; 65 } 66 67 long int cnt = strtol(argv[1], NULL, 10); 68 69 int res; 70 res = devman_get_phone(DEVMAN_CLIENT, IPC_FLAG_BLOCKING); 58 size_t cnt; 59 60 if (test_argc < 1) 61 cnt = DEFAULT_COUNT; 62 else 63 switch (str_size_t(test_argv[0], NULL, 0, true, &cnt)) { 64 case EOK: 65 break; 66 case EINVAL: 67 return "Invalid argument, unsigned integer expected"; 68 case EOVERFLOW: 69 return "Argument size overflow"; 70 default: 71 return "Unexpected argument error"; 72 } 73 74 int res = devman_get_phone(DEVMAN_CLIENT, IPC_FLAG_BLOCKING); 75 71 76 devman_handle_t handle; 72 73 77 res = devman_device_get_handle("/hw/pci0/00:01.0/com1", &handle, 74 78 IPC_FLAG_BLOCKING); 75 if (EOK != res) { 76 printf(NAME ": could not get the device handle, errno = %d.\n", 77 -res); 78 return 1; 79 } 80 81 printf(NAME ": trying to read %d characters from device with handle " 82 "%d.\n", cnt, handle); 79 if (res != EOK) 80 return "Could not get serial device handle"; 83 81 84 82 int phone = devman_device_connect(handle, IPC_FLAG_BLOCKING); 85 if (0 > phone) { 86 printf(NAME ": could not connect to the device, errno = %d.\n", 87 -res); 88 devman_hangup_phone(DEVMAN_CLIENT); 89 return 2; 83 if (phone < 0) { 84 devman_hangup_phone(DEVMAN_CLIENT); 85 return "Unable to connect to serial device"; 90 86 } 91 87 92 88 char *buf = (char *) malloc(cnt + 1); 93 if (NULL == buf) { 94 printf(NAME ": failed to allocate the input buffer\n"); 89 if (buf == NULL) { 95 90 ipc_hangup(phone); 96 91 devman_hangup_phone(DEVMAN_CLIENT); 97 return 3; 98 } 99 100 ipcarg_t old_baud, old_par, old_stop, old_word_size; 92 return "Failed to allocate input buffer"; 93 } 94 95 sysarg_t old_baud; 96 sysarg_t old_par; 97 sysarg_t old_stop; 98 sysarg_t old_word_size; 101 99 102 100 res = ipc_call_sync_0_4(phone, SERIAL_GET_COM_PROPS, &old_baud, 103 101 &old_par, &old_word_size, &old_stop); 104 if (EOK != res) { 105 printf(NAME ": failed to get old communication parameters, " 106 "errno = %d.\n", -res); 107 devman_hangup_phone(DEVMAN_CLIENT); 102 if (res != EOK) { 103 free(buf); 108 104 ipc_hangup(phone); 109 free(buf);110 return 4;105 devman_hangup_phone(DEVMAN_CLIENT); 106 return "Failed to get old serial communication parameters"; 111 107 } 112 108 … … 114 110 SERIAL_NO_PARITY, 8, 1); 115 111 if (EOK != res) { 116 printf(NAME ": failed to set communication parameters, errno = " 117 "%d.\n", -res); 118 devman_hangup_phone(DEVMAN_CLIENT); 112 free(buf); 119 113 ipc_hangup(phone); 120 free(buf); 121 return 4; 122 } 123 124 int total = 0; 125 int read = 0; 114 devman_hangup_phone(DEVMAN_CLIENT); 115 return "Failed to set serial communication parameters"; 116 } 117 118 TPRINTF("Trying to read %zu characters from serial device " 119 "(handle=%" PRIun ")\n", cnt, handle); 120 121 size_t total = 0; 126 122 while (total < cnt) { 127 read = read_dev(phone, buf, cnt - total); 128 if (0 > read) { 129 printf(NAME ": failed read from device, errno = %d.\n", 130 -read); 123 ssize_t read = read_dev(phone, buf, cnt - total); 124 125 if (read < 0) { 131 126 ipc_call_sync_4_0(phone, SERIAL_SET_COM_PROPS, old_baud, 132 127 old_par, old_word_size, old_stop); 128 free(buf); 133 129 ipc_hangup(phone); 134 130 devman_hangup_phone(DEVMAN_CLIENT); 131 return "Failed read from serial device"; 132 } 133 134 if ((size_t) read > cnt - total) { 135 ipc_call_sync_4_0(phone, SERIAL_SET_COM_PROPS, old_baud, 136 old_par, old_word_size, old_stop); 135 137 free(buf); 136 return 5; 137 } 138 total += read; 139 if (read > 0) { 138 ipc_hangup(phone); 139 devman_hangup_phone(DEVMAN_CLIENT); 140 return "Read more data than expected"; 141 } 142 143 TPRINTF("Read %zd bytes\n", read); 144 145 if (read == 0) 146 usleep(DEFAULT_SLEEP); 147 else { 140 148 buf[read] = 0; 141 printf(buf);149 142 150 /* 143 151 * Write data back to the device to test the opposite 144 152 * direction of data transfer. 145 153 */ 146 write_dev(phone, buf, read); 147 } else { 148 usleep(100000); 149 } 150 } 151 152 const char *the_end = "\n---------\nTHE END\n---------\n"; 153 write_dev(phone, (void *)the_end, str_size(the_end)); 154 155 /* restore original communication settings */ 156 ipc_call_sync_4_0(phone, SERIAL_SET_COM_PROPS, old_baud, old_par, 157 old_word_size, old_stop); 154 ssize_t written = write_dev(phone, buf, read); 155 156 if (written < 0) { 157 ipc_call_sync_4_0(phone, SERIAL_SET_COM_PROPS, old_baud, 158 old_par, old_word_size, old_stop); 159 free(buf); 160 ipc_hangup(phone); 161 devman_hangup_phone(DEVMAN_CLIENT); 162 return "Failed write to serial device"; 163 } 164 165 if (written != read) { 166 ipc_call_sync_4_0(phone, SERIAL_SET_COM_PROPS, old_baud, 167 old_par, old_word_size, old_stop); 168 free(buf); 169 ipc_hangup(phone); 170 devman_hangup_phone(DEVMAN_CLIENT); 171 return "Written less data than read from serial device"; 172 } 173 174 TPRINTF("Written %zd bytes\n", written); 175 } 176 177 total += read; 178 } 179 180 TPRINTF("Trying to write EOT banner to the serial device\n"); 181 182 size_t eot_size = str_size(EOT); 183 ssize_t written = write_dev(phone, (void *) EOT, eot_size); 184 185 ipc_call_sync_4_0(phone, SERIAL_SET_COM_PROPS, old_baud, 186 old_par, old_word_size, old_stop); 187 free(buf); 188 ipc_hangup(phone); 158 189 devman_hangup_phone(DEVMAN_CLIENT); 159 ipc_hangup(phone); 160 free(buf); 161 162 return 0; 190 191 if (written < 0) 192 return "Failed to write EOT banner to serial device"; 193 194 if ((size_t) written != eot_size) 195 return "Written less data than the size of the EOT banner " 196 "to serial device"; 197 198 return NULL; 163 199 } 164 200
Note:
See TracChangeset
for help on using the changeset viewer.