xref: /haiku/src/add-ons/kernel/drivers/ports/usb_serial/Tracing.cpp (revision 02354704729d38c3b078c696adc1bbbd33cbcf72)
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("%s", 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