Personal tools

Log in

Changes

From IGEP - ISEE Wiki

Jump to: navigation, search

User:Pau pajuelo

9,332 bytes added, 12:29, 22 August 2012
m
no edit summary
Link all development tools documentation when possible
 
= Overview<br> =
 
This How-To is meant to be a starting point for people to learn use UART for IGEPv2 devices as quickly and easily as possible. In this how-to, we use [http://releases.linaro.org/platform/linaro-m/headless/final/linaro-m-headless-tar-20101108-2.tar.gz Linaro Headless] with [[Linux Kernel 2.6.35.y|Kernel 2.6.35.y]] and [http://labs.isee.biz/images/e/ee/Uart-test-beta2.tar.bz2 UART test program]
 
More information about [http://en.wikipedia.org/wiki/UART UART].
 
'''Note''': This program has a debug option using GPIOs to debug via oscilloscope, this option is useful to learnt about the Kernel latencies. Debug has set to "write" and "select" functions.
 
[[Frequently Asked Questions and Their Answers#How_many_UARTs_are_available.3F|More information]]
 
= Feedback and Contributing =
 
At any point, if you see a mistake you can contribute to this How-To.
 
= Preparing IGEP =
 
=== Configure UART1 and UART3 in IGEP with RS232 levels on J960 connector ===
 
To test UARTs we use UART1 (dev/ttyS0) and UART3 (dev/ttyS2) via J960 connector using RS232 standard.
 
NOTE: Make sure that you installed open SSH server. If you don't have it go [[How to forge a local file system server with IGEP0020 board#Installing_Open_SSH_Server|here]].
 
By default, UART1 is used by RS485 driver, we need to disable it, edit igep.ini file: <br>
<pre>board.ei485= yes
</pre>
UART1 is configured in RS232 driver, when igep line is replaced by (or type in -Maybe you don't found this line-):<br>
<pre>board.ei485= no
</pre>
By default, UART3 is used by Kernel serial console, we need to disable it, go to igep.ini file, comment next line: <br>
<pre>console=ttyS2,115200n8</pre>
=== Check UARTs devices ===
 
Make sure that Kernel detects UARTs, type:
<pre>dmesg | grep tty</pre>
The result will be similar at that:
<pre>root@localhost:~/PROGRAM# dmesg | grep tty
[ 0.000000] console [tty0] enabled
[ 0.598999] serial8250.0: ttyS0 at MMIO 0x4806a000 (irq = 72) is a ST16654
[ 0.784057] serial8250.1: ttyS1 at MMIO 0x4806c000 (irq = 73) is a ST16654
[ 0.969085] serial8250.2: ttyS2 at MMIO 0x49020000 (irq = 74) is a ST16654
[ 1.153503] serial8250.3: ttyS3 at MMIO 0x49042000 (irq = 80) is a ST16654
root@localhost:~/PROGRAM# </pre>
Get information about UARTs, type:
<pre>setserial -g /dev/ttyS[0123]</pre>
The result will be similar at that:
<pre>root@localhost:~/PROGRAM# setserial -g /dev/ttyS*
/dev/ttyS0, UART: 16654, Port: 0x0000, IRQ: 72
/dev/ttyS1, UART: 16654, Port: 0x0000, IRQ: 73
/dev/ttyS2, UART: 16654, Port: 0x0000, IRQ: 74
/dev/ttyS3, UART: 16654, Port: 0x0000, IRQ: 80
root@localhost:~/PROGRAM# </pre>
If you don't have setserial installed type:
<pre>apt-get install setserial</pre>
NOTE: Starting from Kernel 2.6.37.y, ttySx are named ttyOx. You need to edit source program.
 
=== Connect peripherals ===
 
Connect IGEPv2 board using J960 connector like this:
<pre> J960
------
(Not used) x---| 1 2 |---o (Connect to 8)
(Connect to 9) o---| 3 4 |---x (Not used)
(GND)·|---| 5 6 |---|· (GND)
(Not used)x---| 7 8 |---o (Connect to 2)
(Connect to 3) o---| 9 10 |---x (Not used)
------
</pre>
=== Send some data ===
 
Use minicom to prove it, open two terminals via SSH&nbsp;and log with root user:
 
Terminal 1:
<pre>minicom -D /dev/ttyS0</pre>
Terminal 2:
<pre>minicom -D /dev/ttyS2 </pre>
Type something in one terminal.
 
{| cellspacing="1" cellpadding="1" width="200" border="1" align="center"
|-
| style="text-align: left;" | [[Image:Minicom screenshot.png|640x400px]]
|}
 
= Schematics =
 
=== RS232 Schematic Igep V2 ===
 
{| cellspacing="1" cellpadding="1" border="1" align="center"
|-
| [[Image:RS232 Schematic Igep V2.png|800x531px]]
|}
 
<br>
 
=== Uart Schematic Igep Module ===
 
{| cellspacing="1" cellpadding="1" width="200" border="1" align="center"
|-
| [[Image:Uart Schematic Igep Module.png|581x600px]]
|}
 
= Compile and run program =
 
Download [http://labs.isee.biz/images/e/ee/Uart-test-beta2.tar.bz2 program source].
 
As explained above, the program uses GPIO for debug option via oscilloscope, it is necessary install user-gpio-drv.ko driver inside Linux Kernel, more information [[How to use GPIOs|here]] .
 
There are some interesting things to configure, before compiling the program. Open it, seek next lines:
<pre>//Define Array char size
#define SIZE 30
//Define Debug mode:0==Disable
#define DEBUG 0
 
//Define wait select
#define WAIT 5
 
//Set GPIO Debugger port
//Be sure that mux is correctly configured and GPIOs are not used
#define GPIO1 136
#define GPIO2 137 </pre>
Constant SIZE: it determines the max number of char than can be sent<br>
 
Constant DEBUG: it can break program infinite loop part, it can be useful to debug some errors, 0 (infinite loop) or positive number determine loop max entrances
 
Constant WAIT: it configurea select max time.
 
Constants GPIO1 and GPIO2: they configure GPIOs used for debug via oscilloscope. Take care to configure mux and don't use them for other purposes<br>
 
Once you have installed module. Compile program using your Cross Compiler, I used arm-linux-gnueabi-:
<pre>arm-linux-gnueabi-gcc uart-test-beta1.c -o uart-test-beta1 </pre>
= Testing UART =
 
Some tests do it:
 
=== Decode Characters ===
 
Decoded with [http://www.asciitable.com/ ASCII table].
 
{| cellspacing="1" cellpadding="1" width="200" border="1" align="center"
|-
| [[Image:Uart decode1withlf.JPG|350x230px]]
| [[Image:Uart decode0withlf.JPG|350x230px]]
| [[Image:Uart decode100000withlf.JPG|350x230px]]
|-
| Decoding "1\n"
| Decoding "0\n"
| Decoding "100000\n"
|}
 
Click to enlarge image
 
=== select timeout ===
 
Program sends information via UART1 but don't receive response via UART3, because only a process is executed. This problem is repeated every 5 seconds (constant WAIT=5) until other process sends information via UART3 at the same speed. If "select" hasn't been implemented, process would have stayed blocked.<br>
 
{| cellspacing="1" cellpadding="1" width="200" border="1" align="center"
|-
| [[Image:Uart select timeout9.JPG|350x230px]]
|-
| UART1=Blue and UART3=Green
|}
 
Click to enlarge image
 
=== RS232 Voltage params ===
 
More information [http://en.wikipedia.org/wiki/RS-232#Standard_details here].
 
{| cellspacing="1" cellpadding="1" width="200" border="1" align="center"
|-
| [[Image:Uart voltageparams8.JPG|350x230px]]
|-
| Vpp=11.8V aprox , Vmin=-5.6V aprox
|}
 
Click to enlarge image
 
=== Speed Overview ===
 
Note that wave is degraded when speed is higher
 
{| cellspacing="1" cellpadding="1" width="200" border="1" align="center"
|-
| [[Image:Uart 300 o.JPG|260x172px]]
| [[Image:Uart 4800 o.JPG|260x172px]]
| [[Image:Uart 115200 o.JPG|260x172px]]
| [[Image:Uart 3000000 o.JPG|260x172px]]
|-
| Overview signal to 300 bauds
| Overview signal to 4800 bauds
| Overview signal to 115200 bauds
| Overview signal to 3000000 bauds
|-
| [[Image:Uart 300 s.JPG|260x172px]]
| [[Image:Uart 4800 s.JPG|260x172px]]
| [[Image:Uart 115200 s.JPG|260x172px]]
| [[Image:Uart 3000000 s.JPG|260x172px]]
|-
| Specific wave to 300 bauds
| Specific wave to 4800 bauds
| Specific wave to 115200 bauds<br>
| Specific wave to 3000000 bauds<br>
|}
 
Click to enlarge image
 
=== Lag ===
 
You can see that RS232 have some lag between transmisions. This caused mainly by kernel process management. UART peripheral is controlled by Linux and It isn't a [http://en.wikipedia.org/wiki/Real-time_operating_system real-time operating system].&nbsp;
 
{| cellspacing="1" cellpadding="1" width="200" border="1" align="center"
|-
| [[Image:Uart lag left6.JPG|350x230px]]
| [[Image:Uart lag right7.JPG|350x230px]]select: blocked until all data is available.
|-
| Lag between UART1 and UART3 (300 bauds)
| Lag between UART3 and UART1 (300 bauds)
|}
 
Click to enlarge image
 
This program have three I/O functions that connect to UART driver via ioctl: (read(), write() and select()). But select() and write() change process stat to sleep mode until system don't receive or transmit all information via UART. "select" function is used to prevent that read function can be blocked when data aren't available. <br>The next images (program with debug_gpio enabled and 300 bauds speed) show when process is executed or is waiting. Blue=UART1, Violet="write" and Green="select". When GPIO has HIGH value, process is blocked.<br>
 
{| cellspacing="1" cellpadding="1" width="200" border="1" align="center"
|-
| [[Image:Uart select5.JPG|260x172px]]
| [[Image:Uart select to write1.JPG|260x172px]]
| [[Image:Uart write2.JPG|260x172px]]
| [[Image:Uart write to select0.JPG|260x172px]]
|-
| select function time
| Time between select and write
| write function time
| Time between write and select
|}
 
Click to enlarge image<br>
 
In this case:
 
select: blocked until all data is available (LF char received).
 
write: blocked until all data is send to UART buffer.
 
=== Error test ===
 
Every full process the number is increased twice. Program checks that this condicion is true, if it isn't accomplished, process will be finish.
 
{| cellspacing="1" cellpadding="1" width="200" border="1" align="center"
|-
| [[Image:Uart error test2.png|640x400px]]
|-
| Runs 16h without any transfer error (3000000 bauds)<br>
|}
 
<br>
 
[[Category:UART]]
= Getting started with IGEPv2 Expansion<br> =
4,199
edits