1 /* 2 * Copyright (c) 2007-2008 by Michael Lotz 3 * Heavily based on the original usb_serial driver which is: 4 * 5 * Copyright (c) 2003 by Siarzhuk Zharski <imker@gmx.li> 6 * Distributed under the terms of the MIT License. 7 */ 8 #include "Tracing.h" 9 #include "Driver.h" 10 #include "USB3.h" 11 12 #include <stdio.h> //sprintf 13 #include <unistd.h> //posix file i/o - create, write, close 14 #include <Drivers.h> 15 #include <directories.h> 16 #include <driver_settings.h> 17 18 19 #if DEBUG 20 bool gLogEnabled = true; 21 #else 22 bool gLogEnabled = false; 23 #endif 24 25 bool gLogToFile = false; 26 bool gLogAppend = false; 27 bool gLogFunctionCalls = true; 28 bool gLogFunctionReturns = true; 29 bool gLogFunctionResults = true; 30 31 static const char *sLogFilePath = kSystemLogDirectory "/" DRIVER_NAME ".log"; 32 static sem_id sLogLock; 33 34 35 void 36 load_settings() 37 { 38 void *settingsHandle; 39 settingsHandle = load_driver_settings(DRIVER_NAME); 40 if (settingsHandle == NULL) 41 return; 42 43 #if !DEBUG 44 gLogEnabled = get_driver_boolean_parameter(settingsHandle, 45 "debug_output", gLogEnabled, true); 46 #endif 47 48 gLogToFile = get_driver_boolean_parameter(settingsHandle, 49 "debug_output_in_file", gLogToFile, true); 50 gLogAppend = !get_driver_boolean_parameter(settingsHandle, 51 "debug_output_file_rewrite", !gLogAppend, true); 52 gLogFunctionCalls = get_driver_boolean_parameter(settingsHandle, 53 "debug_trace_func_calls", gLogFunctionCalls, false); 54 gLogFunctionReturns = get_driver_boolean_parameter(settingsHandle, 55 "debug_trace_func_returns", gLogFunctionReturns, false); 56 gLogFunctionResults = get_driver_boolean_parameter(settingsHandle, 57 "debug_trace_func_results", gLogFunctionResults, false); 58 59 unload_driver_settings(settingsHandle); 60 } 61 62 63 void 64 create_log_file() 65 { 66 if(!gLogToFile) 67 return; 68 69 int flags = O_WRONLY | O_CREAT | (!gLogAppend ? O_TRUNC : 0); 70 close(open(sLogFilePath, flags, 0666)); 71 sLogLock = create_sem(1, DRIVER_NAME"-logging"); 72 } 73 74 75 void 76 usb_serial_trace(bool force, const char *format, ...) 77 { 78 if (!gLogEnabled && !force) 79 return; 80 81 static char buffer[1024]; 82 char *bufferPointer = buffer; 83 if (!gLogToFile) { 84 const char *prefix = "\33[32m" DRIVER_NAME ":\33[0m "; 85 strcpy(bufferPointer, prefix); 86 bufferPointer += strlen(prefix); 87 } 88 89 va_list argumentList; 90 va_start(argumentList, format); 91 vsprintf(bufferPointer, format, argumentList); 92 va_end(argumentList); 93 94 if (gLogToFile) { 95 acquire_sem(sLogLock); 96 int fd = open(sLogFilePath, O_WRONLY | O_APPEND); 97 write(fd, buffer, strlen(buffer)); 98 close(fd); 99 release_sem(sLogLock); 100 } else 101 dprintf(buffer); 102 } 103 104 105 void 106 trace_termios(struct termios *tios) 107 { 108 TRACE("struct termios:\n" 109 "\tc_iflag: 0x%08x\n" 110 "\tc_oflag: 0x%08x\n" 111 "\tc_cflag: 0x%08x\n" 112 "\tc_lflag: 0x%08x\n" 113 "\tc_line: 0x%08x\n" 114 "\tc_ispeed: 0x%08x\n" 115 "\tc_ospeed: 0x%08x\n" 116 "\tc_cc[0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x]\n", 117 tios->c_iflag, tios->c_oflag, tios->c_cflag, tios->c_lflag, 118 tios->c_line, 119 tios->c_ispeed, tios->c_ospeed, 120 tios->c_cc[0], tios->c_cc[1], tios->c_cc[2], tios->c_cc[3], 121 tios->c_cc[4], tios->c_cc[5], tios->c_cc[6], tios->c_cc[7], 122 tios->c_cc[8], tios->c_cc[9], tios->c_cc[10]); 123 } 124