diff options
| author | J Freyensee <james_p_freyensee@linux.intel.com> | 2011-05-06 19:56:48 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-05-13 19:31:00 -0400 |
| commit | cb9e84c4123088f4641009f5217b7d32b307992f (patch) | |
| tree | 09197e3d4bb821b3c5d545fd0443f376a21158f6 | |
| parent | 7d74f492e4dd0034a61458eb80f70b1d2862ed07 (diff) | |
Kernel documentation for the PTI feature.
This provides Kernel documentation for the PTI
feature and setting line discipline drivers
on top of tty's for Linux mobile solutions.
Signed-off-by: J Freyensee <james_p_freyensee@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
| -rw-r--r-- | Documentation/pti/pti_intel_mid.txt | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/Documentation/pti/pti_intel_mid.txt b/Documentation/pti/pti_intel_mid.txt new file mode 100644 index 000000000000..e7a5b6d1f7a9 --- /dev/null +++ b/Documentation/pti/pti_intel_mid.txt | |||
| @@ -0,0 +1,99 @@ | |||
| 1 | The Intel MID PTI project is HW implemented in Intel Atom | ||
| 2 | system-on-a-chip designs based on the Parallel Trace | ||
| 3 | Interface for MIPI P1149.7 cJTAG standard. The kernel solution | ||
| 4 | for this platform involves the following files: | ||
| 5 | |||
| 6 | ./include/linux/pti.h | ||
| 7 | ./drivers/.../n_tracesink.h | ||
| 8 | ./drivers/.../n_tracerouter.c | ||
| 9 | ./drivers/.../n_tracesink.c | ||
| 10 | ./drivers/.../pti.c | ||
| 11 | |||
| 12 | pti.c is the driver that enables various debugging features | ||
| 13 | popular on platforms from certain mobile manufacturers. | ||
| 14 | n_tracerouter.c and n_tracesink.c allow extra system information to | ||
| 15 | be collected and routed to the pti driver, such as trace | ||
| 16 | debugging data from a modem. Although n_tracerouter | ||
| 17 | and n_tracesink are a part of the complete PTI solution, | ||
| 18 | these two line disciplines can work separately from | ||
| 19 | pti.c and route any data stream from one /dev/tty node | ||
| 20 | to another /dev/tty node via kernel-space. This provides | ||
| 21 | a stable, reliable connection that will not break unless | ||
| 22 | the user-space application shuts down (plus avoids | ||
| 23 | kernel->user->kernel context switch overheads of routing | ||
| 24 | data). | ||
| 25 | |||
| 26 | An example debugging usage for this driver system: | ||
| 27 | *Hook /dev/ttyPTI0 to syslogd. Opening this port will also start | ||
| 28 | a console device to further capture debugging messages to PTI. | ||
| 29 | *Hook /dev/ttyPTI1 to modem debugging data to write to PTI HW. | ||
| 30 | This is where n_tracerouter and n_tracesink are used. | ||
| 31 | *Hook /dev/pti to a user-level debugging application for writing | ||
| 32 | to PTI HW. | ||
| 33 | *Use mipi_* Kernel Driver API in other device drivers for | ||
| 34 | debugging to PTI by first requesting a PTI write address via | ||
| 35 | mipi_request_masterchannel(1). | ||
| 36 | |||
| 37 | Below is example pseudo-code on how a 'privileged' application | ||
| 38 | can hook up n_tracerouter and n_tracesink to any tty on | ||
| 39 | a system. 'Privileged' means the application has enough | ||
| 40 | privileges to successfully manipulate the ldisc drivers | ||
| 41 | but is not just blindly executing as 'root'. Keep in mind | ||
| 42 | the use of ioctl(,TIOCSETD,) is not specific to the n_tracerouter | ||
| 43 | and n_tracesink line discpline drivers but is a generic | ||
| 44 | operation for a program to use a line discpline driver | ||
| 45 | on a tty port other than the default n_tty. | ||
| 46 | |||
| 47 | /////////// To hook up n_tracerouter and n_tracesink ///////// | ||
| 48 | |||
| 49 | // Note that n_tracerouter depends on n_tracesink. | ||
| 50 | #include <errno.h> | ||
| 51 | #define ONE_TTY "/dev/ttyOne" | ||
| 52 | #define TWO_TTY "/dev/ttyTwo" | ||
| 53 | |||
| 54 | // needed global to hand onto ldisc connection | ||
| 55 | static int g_fd_source = -1; | ||
| 56 | static int g_fd_sink = -1; | ||
| 57 | |||
| 58 | // these two vars used to grab LDISC values from loaded ldisc drivers | ||
| 59 | // in OS. Look at /proc/tty/ldiscs to get the right numbers from | ||
| 60 | // the ldiscs loaded in the system. | ||
| 61 | int source_ldisc_num, sink_ldisc_num = -1; | ||
| 62 | int retval; | ||
| 63 | |||
| 64 | g_fd_source = open(ONE_TTY, O_RDWR); // must be R/W | ||
| 65 | g_fd_sink = open(TWO_TTY, O_RDWR); // must be R/W | ||
| 66 | |||
| 67 | if (g_fd_source <= 0) || (g_fd_sink <= 0) { | ||
| 68 | // doubt you'll want to use these exact error lines of code | ||
| 69 | printf("Error on open(). errno: %d\n",errno); | ||
| 70 | return errno; | ||
| 71 | } | ||
| 72 | |||
| 73 | retval = ioctl(g_fd_sink, TIOCSETD, &sink_ldisc_num); | ||
| 74 | if (retval < 0) { | ||
| 75 | printf("Error on ioctl(). errno: %d\n", errno); | ||
| 76 | return errno; | ||
| 77 | } | ||
| 78 | |||
| 79 | retval = ioctl(g_fd_source, TIOCSETD, &source_ldisc_num); | ||
| 80 | if (retval < 0) { | ||
| 81 | printf("Error on ioctl(). errno: %d\n", errno); | ||
| 82 | return errno; | ||
| 83 | } | ||
| 84 | |||
| 85 | /////////// To disconnect n_tracerouter and n_tracesink //////// | ||
| 86 | |||
| 87 | // First make sure data through the ldiscs has stopped. | ||
| 88 | |||
| 89 | // Second, disconnect ldiscs. This provides a | ||
| 90 | // little cleaner shutdown on tty stack. | ||
| 91 | sink_ldisc_num = 0; | ||
| 92 | source_ldisc_num = 0; | ||
| 93 | ioctl(g_fd_uart, TIOCSETD, &sink_ldisc_num); | ||
| 94 | ioctl(g_fd_gadget, TIOCSETD, &source_ldisc_num); | ||
| 95 | |||
| 96 | // Three, program closes connection, and cleanup: | ||
| 97 | close(g_fd_uart); | ||
| 98 | close(g_fd_gadget); | ||
| 99 | g_fd_uart = g_fd_gadget = NULL; | ||
