I've downloaded Robert C Nelson's code and run build_kernel.sh and 
install_kernel.sh. I've controlled that sources are patched by rs485 patch.
BBB booted up normally and uname -r says that I am running new kernel. But 
I don't have patched kernel headers. I have created serial.h header as 
following:
 1 #include <linux/types.h>
  2 
  3 
  4 struct serial_rs485 {
  5         __u32   flags;                  /* RS485 feature flags */
  6 #define SER_RS485_ENABLED               (1 << 0)        /* If enabled */
  7 #define SER_RS485_RTS_ON_SEND           (1 << 1)        /* Logical 
level for
  8                                                            RTS pin when 
    
  9                                                            sending */
 10 #define SER_RS485_RTS_AFTER_SEND        (1 << 2)        /* Logical 
level for
 11                                                            RTS pin 
after sent*/
 12 #define SER_RS485_RTS_BEFORE_SEND (1 << 3)
 13 #define SER_RS485_USE_GPIO (1 << 5)
 14 //#define SER_RS485_RX_DURING_TX          (1 << 4)
 15         __u32   delay_rts_before_send;  /* Delay before send 
(milliseconds) */
 16         __u32   delay_rts_after_send;   /* Delay after send 
(milliseconds) */
 17 //       __u32   padding[5];             /* Memory is cheap, new structs
 18                 __u32 gpio_pin; /* GPIO Pin Index */
 19                 __u32 padding[4]; /* Memory is cheap, new structs
 20                         are a royal PITA .. */
 21 };


and used it in small example program:
#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include "serial.h"
//#include <include/uapi/linux/serial.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd = open("/dev/ttyO4", O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd < 0)
    {
        perror("Error opening tty!");
        return 1;
    }

    struct serial_rs485 rs485conf;

    rs485conf.flags |= SER_RS485_ENABLED;

    rs485conf.flags |= SER_RS485_USE_GPIO;
    rs485conf.gpio_pin = 9;
    rs485conf.flags |= SER_RS485_RTS_ON_SEND;
    rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND);
    rs485conf.delay_rts_before_send = 0;
    rs485conf.delay_rts_after_send = 0;

    if (ioctl (fd, TIOCSRS485, &rs485conf) < 0)
    {
            perror("Bad ioctl");
    }
    
    struct termios ttyc;
    tcgetattr(fd, &ttyc);
    
    cfsetospeed(&ttyc, B9600);           
    cfsetispeed(&ttyc, B9600);
    ttyc.c_cflag &= ~CRTSCTS;
    ttyc.c_cflag |= CS8 | CLOCAL | CREAD;
    ttyc.c_cflag |= CRTSCTS;
    ttyc.c_cc[VMIN] = 1;
    ttyc.c_cc[VTIME] = 5;
    tcsetattr(fd, TCSANOW, &ttyc);
    
    char data = 0xAA;

    int i = 0;
    while(i < 10000)
    {
        if(write(fd, &data, 1) < 1)
        {
            perror("Error sending char");
            break;
        }
            
        i++;
    }
        
    if (close (fd) < 0)
    {
        perror("Error closing tty!");
        return 1;
    }


    return 0;
}
but RTS pin stays still LOW.


Dne čtvrtek, 4. září 2014 21:51:58 UTC+2 Mickae1 napsal(a):
>
> In the Debian image from Robert C Nelson, the patch rs485 is already 
> included. 
> Le 4 sept. 2014 20:57, <[email protected] <javascript:>> a écrit :
>
>> Thank you for your answers. The python code is working perfectly. 
>> I need to use it in greater C project though. So I am compiling new 
>> kernel including RS485 patch. I have tried 
>> /opt/scripts/tools/update_kernel.sh hoping that it includes the RS485 patch 
>> ...unsuccessfully.
>> I am now following steps from 
>> http://jkridner.wordpress.com/2014/06/04/yet-another-set-of-notes-on-building-beaglebone-kernel/
>>
>> Dne středa, 3. září 2014 17:57:53 UTC+2 [email protected] napsal(a):
>>>
>>> Hello,
>>> I'm writing an app for BeagleBoneBlack running debian (3.8.13-bone50). I 
>>> would like to use UART4 to communicate with RS485 transmitter over 
>>> P9.24(UART4 Tx), P9.26(UART4 Rx) and P8.33 (UART4 RTS). 
>>> I've disabled HDMI and enabled overlays BB-UART4 and BB-UART4-RTSCTS
>>>
>>>  cat /sys/devices/bone_capemgr.9/slots
>>>  0: 54:PF--- 
>>>  1: 55:PF--- 
>>>  2: 56:PF--- 
>>>  3: 57:PF--- 
>>>  4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
>>>  5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
>>>  6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
>>>  7: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART4
>>> 10: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART4-RTSCTS
>>>
>>> cat /proc/tty/driver/OMAP-SERIAL 
>>> serinfo:1.0 driver revision:
>>> 0: uart:OMAP UART0 mmio:0x44E09000 irq:72 tx:345 rx:0 RTS|CTS|DTR|DSR
>>> 4: uart:OMAP UART4 mmio:0x481A8000 irq:45 tx:61355 rx:1 brk:1 RTS|DTR|
>>> DSR
>>>
>>>
>>> RS485 transmitter is connected through RS485-USB converter to PC. When I 
>>> run screen /dev/ttyO4 9600 +crtscts and periodicaly write some data to it, 
>>> PC receives it properly, but RTS line stays constantly low (I'm using scope 
>>> on Tx and RTS lines). 
>>> I've also tried to write simple C program, using *struct serial_rs485. 
>>> *When 
>>> I write some data over this program, I got response: *Resource 
>>> temporarily unavailable* and dmesg says 
>>> *omap_uart 481a8000.serial: Must use GPIO for RS485 Support. *When I 
>>> tried to use:
>>> struct serial_rs485 rs485conf;
>>> rs485conf.flags |= SER_RS485_USE_GPIO;
>>> rs485conf.gpio_pin = GPIO0_9;
>>>
>>> I got error from gcc that it does not know those macros:
>>> ‘SER_RS485_USE_GPIO’ was not declared in this scope
>>>  rs485conf.flags |= SER_RS485_USE_GPIO;
>>> ‘struct serial_rs485’ has no member named ‘gpio_pin’
>>>   rs485conf.gpio_pin = GPIO0_9;
>>> ‘GPIO0_9’ was not declared in this scope
>>>   rs485conf.gpio_pin = GPIO0_9;
>>>
>>> Could somebody help me? I have no more ideas.
>>>
>>>
>>>
>>>
>>>
>>>  -- 
>> For more options, visit http://beagleboard.org/discuss
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "BeagleBoard" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to