Добрый день!
Использую отладочную плату AT91SAM9261-EK. Ядро linux-2.6.30 с наложенными патчами. Необходимо настроить USART1 на режим RS485 и затем производить опрос датчиков по протоколу modbusRTU.
Как я понимаю, в ядре существует драйвер последовательного порта. Но по умолчанию настраивается только DBGU.
В файле linux/arch/arm/mach-at91/board-sam9261ek.c в функции ek_init_map_io
Код
static void __init ek_map_io(void)
{
/* Initialize processor: 18.432 MHz crystal */
at91sam9261_initialize(18432000);
/* Setup the LEDs */
at91_init_leds(AT91_PIN_PA13, AT91_PIN_PA14);
/* DGBU on ttyS0. (Rx & Tx only) */
at91_register_uart(0, 0, 0);
/* set serial console to ttyS0 (ie, DBGU) */
at91_set_serial_console(0);
}
я добавляю строку
Код
at91_register_uart(AT91SAM9261_ID_US1, 1, 0);
ТАкже в файле linux/drivers/char/atmel_serial.c в функции atmel_set_mctrl и atmel_set_termios меняю строки:
Код
if (port->irq == 7) // USART1 is a rs485
{
mode |= ATMEL_US_USMODE_RS485;
}
else
{
mode |= ATMEL_US_CHMODE_NORMAL;
}
Таким образом, после загрузки ядра в каталоге /dev кроме ttyS0(которое отвечает за DBGU) появляется файл ttyS1, который, как я понимаю, отвечает за USART1??? Или я неправильно понимаю???
Значит ли это, что я могу, как в обычном случае, открывать порт в своей программе, читать и писать в него??
Код
//********************************************************************************
*****
//input : Mbc_port - string with the device to open (/dev/ttyS0, /dev/ttyS1,...);
// Mbc_speed - speed (baudrate)
// Mbc_parity - 0=don't use parity, 1=use parity EVEN, -1 use parity ODD
// Mbc_bit_l - number of data bits : 7 or 8 USE EVERY TIME 8 DATA BITS
// Mbc_bit_s - number of stop bits : 1 or 2
//answer; device descriptor
//********************************************************************************
****/
int Mb_open_device(char Mbc_port[20], int Mbc_speed, int Mbc_parity, int Mbc_bit_l, int Mbc_bit_s)
{
int fd;
fd = open(Mbc_port, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd < 0)
{
perror("Open device failure\n");
exit(-1);
}
else
{
fcntl(fd, F_SETFL, 0);
}
tcgetattr(fd, &saved_tty_parameters);
switch (Mbc_speed)
{
case 2400:
cfsetispeed(&Mb_tio, B2400);
cfsetospeed(&Mb_tio, B2400);
break;
case 4800:
cfsetispeed(&Mb_tio, B4800);
cfsetospeed(&Mb_tio, B4800);
break;
case 9600:
cfsetispeed(&Mb_tio, B9600);
cfsetospeed(&Mb_tio, B9600);
break;
case 19200:
cfsetispeed(&Mb_tio, B19200);
cfsetospeed(&Mb_tio, B19200);
break;
case 38400:
cfsetispeed(&Mb_tio, B38400);
cfsetospeed(&Mb_tio, B38400);
break;
case 57600:
cfsetispeed(&Mb_tio, B57600);
cfsetospeed(&Mb_tio, B57600);
break;
case 115200:
cfsetispeed(&Mb_tio, B115200);
cfsetospeed(&Mb_tio, B115200);
break;
}
Mb_tio.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &Mb_tio);
Mb_tio.c_cflag &= ~PARENB;
Mb_tio.c_cflag &= ~CSIZE;
Mb_tio.c_cflag |= CS8;
Mb_tio.c_cflag |= CSTOPB;
Mb_tio.c_lflag |= ICANON;
Mb_tio.c_iflag &= ~(IXON | IXOFF | IXANY);
return fd;
}
int main (int argc, char **argv)
{
int fd;
char buf[10];
int result, result1, i;
fd = Mb_open_device("/dev/ttyS1", 9600, 0, 8, 1);
if (fd < 0)
{
printf("Failed to open device\n");
return 1;
}
result = read (fd, buf, 2);
if (result == -1)
{
printf("failed to read to the port\n");
return 1;
}
result1 = write (fd, "ABCD", 5);
if (result1 == -1)
{
printf("failed to write to the port\n");
return 1;
}
}
Пожалуйста, подскажите, в правильном ли направлении я движусь, и, если возможно, укажите ссылку на какой-нить настроечный пример.