Difference between revisions of "User:JanosA"

From ArmadeusWiki
Jump to: navigation, search
Line 1: Line 1:
 +
== About Me ==
 
I am IP Network and Datacenter engineer, currently I'm working for an Internet Service Provider in Hungary.
 
I am IP Network and Datacenter engineer, currently I'm working for an Internet Service Provider in Hungary.
  
 
My hobby is programming embedded systems and creating my own small electronic boards.
 
My hobby is programming embedded systems and creating my own small electronic boards.
  
== Skills ==
+
=== Skills ===
 
* Assembly programming: PIC 8bit family
 
* Assembly programming: PIC 8bit family
 
* C programming: PIC 8bit / PIC32MX family, Linux
 
* C programming: PIC 8bit / PIC32MX family, Linux
Line 11: Line 12:
 
* IP networking
 
* IP networking
  
== My ArmadeuS plans (APF28 based) ==
+
=== My ArmadeuS plans (APF28 based) ===
 
* Creating an universal home automation hardware for my friends, with easy programming in perl or PHP. :)
 
* Creating an universal home automation hardware for my friends, with easy programming in perl or PHP. :)
 
* Datacenter temperature monitoring, with RS-485 and OneWire communications.
 
* Datacenter temperature monitoring, with RS-485 and OneWire communications.
 
* Data logger for Saia Sbus based intelligent power meters.
 
* Data logger for Saia Sbus based intelligent power meters.
 +
 +
=== Currently I working on: ===
 +
* RS485 support for driver: mxs-auart.c (APF28 2.6.35.3+ kernel)
 +
* Next will be: Integrate and test the Linux kernel's one wire (w1) driver with APF28.
  
  

Revision as of 23:50, 6 May 2013

About Me

I am IP Network and Datacenter engineer, currently I'm working for an Internet Service Provider in Hungary.

My hobby is programming embedded systems and creating my own small electronic boards.

Skills

  • Assembly programming: PIC 8bit family
  • C programming: PIC 8bit / PIC32MX family, Linux
  • Perl, PHP, Javascript, Html programming with MySQL
  • Linux system administration
  • RS-232/485 serial communications: Ascii, Modbus, Saia Sbus, etc.
  • IP networking

My ArmadeuS plans (APF28 based)

  • Creating an universal home automation hardware for my friends, with easy programming in perl or PHP. :)
  • Datacenter temperature monitoring, with RS-485 and OneWire communications.
  • Data logger for Saia Sbus based intelligent power meters.

Currently I working on:

  • RS485 support for driver: mxs-auart.c (APF28 2.6.35.3+ kernel)
  • Next will be: Integrate and test the Linux kernel's one wire (w1) driver with APF28.


RS485

Informations and mini HOWTOs for my APF28/iMX28 mxs-auart and busybox stty patches.

Linux stty

  • Setup APF28 serial port for RS485 communication:
# stty -F /dev/ttySP0 raw
# stty -F /dev/ttySP0 -echo -echoe -echok
# stty -F /dev/ttySP0 rs485
  • Set extra delays for TXEN/RTS signaling before and after the transmitted packet (in microseconds):
# stty -F /dev/ttySP0 rs485delaybefore 100
# stty -F /dev/ttySP0 rs485delayafter 100
  • To get current RS485 parameters. (If the port device supports the RS485 options you will see the last two lines)
# stty -F /dev/ttySP0
speed 9600 baud; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-brkint -imaxbel
rs485 -rs485rtsonsend -rs485rtsaftersend -rs485rxduringtx
rs485delaybefore = 100; rs485delayafter = 100; rs485delaylastchartx = 1250;

Please note:

  • You can't set the "rs485delaylastchartx" parameter, it's calculated automatically from the baudrate.

Special notes for the APF28/iMX28 mxs-auart driver:

  • All delays are in microseconds.
  • The "rs485delaylastchartx" parameter is not used in DMA mode.
  • The parameters: "rs485rtsonsend" "rs485rtsaftersend" "rs485rxduringtx" are not used.
  • If the RS485 mode is turned on, it will override (turn off) the RTS/CTS hardware flow settings of the uart, don't care what is configured.

C code

  • The RS485 mode can be turned on with ioctl calls from C code, here is the example:
#include <stdio.h>
#include <fcntl.h>
#include <linux/ioctl.h>
#include <linux/serial.h>
#include <asm-generic/ioctls.h> /* TIOCGRS485 + TIOCSRS485 ioctl definitions */

int main(void) {
         struct serial_rs485 rs485conf;

         int fd = open ("/dev/ttySP0", O_RDWR);
         if (fd < 0) {
                 printf("Error: Can't open: /dev/ttySP0\n");
         }


         /* Don't forget to read first the current state of the RS485 options with ioctl.
            If You don't do this, You will destroy the rs485conf.delay_rts_last_char_tx
            parameter which is automatically calculated by the driver when You opens the
            port device. */
         if (ioctl (fd, TIOCGRS485, &rs485conf) < 0) {
                 printf("Error: TIOCGRS485 ioctl not supported.\n");
         }

         /* Enable RS485 mode: */
         rs485conf.flags |= SER_RS485_ENABLED;

         /* Set rts/txen delay before send, if needed: (in microseconds) */
         rs485conf.delay_rts_before_send = 0;

         /* Set rts/txen delay after send, if needed: (in microseconds) */
         rs485conf.delay_rts_after_send = 0;

         if (ioctl (fd, TIOCSRS485, &rs485conf) < 0) {
                 printf("Error: TIOCSRS485 ioctl not supported.\n");
         }

         fcntl(fd, F_SETFL, 0);
         int n = write(fd, "ABC\r\n", 5);
         if (n < 0) {
                 /* Error handling */
         }

         if (close (fd) < 0) {
                 printf("Error: Can't close: /dev/ttySP0\n");
         }
}

Hardware Notes

  • The RS485 Transmit Enable (TXEN) output will be the RTS pin of the uart.
  • The TXEN/RTS output is _active low_, it must be inverted to use it with the popular RS485 transceiver ICs.
  • When the u-boot runs and the board start to boot, the RTS pin works as input, please add a pullup resistor to this pin before the inverter, to prevent RS485 bus lockups.