Changeset c4f5cc54 in rtems


Ignore:
Timestamp:
May 3, 2018, 6:54:02 AM (13 months ago)
Author:
Christian Mauderer <christian.mauderer@…>
Branches:
master
Children:
4387010
Parents:
c8dcdf54
git-author:
Christian Mauderer <christian.mauderer@…> (05/03/18 06:54:02)
git-committer:
Christian Mauderer <christian.mauderer@…> (05/14/18 07:01:33)
Message:

dev/sc16is752: Add ioctl calls for modem controll.

This add ths following ioctl calls to the sc16is752 driver:

  • TIOCMGET
  • TIOCMSET
  • TIOCMBIS
  • TIOCMBIC
Location:
cpukit/dev/serial
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cpukit/dev/serial/sc16is752-regs.h

    rc8dcdf54 rc4f5cc54  
    100100
    101101/* MCR */
    102 #define MCR_PRESCALE_NEEDED (1u << 0)
     102#define MCR_DTR             (1u << 0)
     103#define MCR_RTS             (1u << 1)
     104#define MCR_TCR_TLR         (1u << 2)
     105#define MCR_LOOPBACK        (1u << 4)
     106#define MCR_XON_ANY         (1u << 5)
     107#define MCR_IRDA_ENABLE     (1u << 6)
     108#define MCR_PRESCALE_NEEDED (1u << 7)
     109
     110/* MSR */
     111#define MSR_dCTS (1u << 0)
     112#define MSR_dDSR (1u << 1)
     113#define MSR_dRI  (1u << 2)
     114#define MSR_dCD  (1u << 3)
     115#define MSR_CTS  (1u << 4)
     116#define MSR_DSR  (1u << 5)
     117#define MSR_RI   (1u << 6)
     118#define MSR_CD   (1u << 7)
    103119
    104120/* EFR */
  • cpukit/dev/serial/sc16is752.c

    rc8dcdf54 rc4f5cc54  
    278278}
    279279
     280static void sc16is752_get_modem_bits(sc16is752_context *ctx, int *bits)
     281{
     282  *bits = 0;
     283  uint8_t msr;
     284  uint8_t mcr;
     285
     286  read_reg(ctx, SC16IS752_MSR, &msr, 1);
     287  read_reg(ctx, SC16IS752_MCR, &mcr, 1);
     288
     289  if (msr & MSR_CTS) {
     290    *bits |= TIOCM_CTS;
     291  }
     292  if (msr & MSR_DSR) {
     293    *bits |= TIOCM_DSR;
     294  }
     295  if (msr & MSR_RI) {
     296    *bits |= TIOCM_RI;
     297  }
     298  if (msr & MSR_CD) {
     299    *bits |= TIOCM_CD;
     300  }
     301  if ((mcr & MCR_DTR) == 0) {
     302    *bits |= TIOCM_DTR;
     303  }
     304  if ((mcr & MCR_RTS) == 0) {
     305    *bits |= TIOCM_RTS;
     306  }
     307}
     308
     309static void sc16is752_set_modem_bits(
     310  sc16is752_context *ctx, int *bits, int set, int clear
     311)
     312{
     313  uint8_t mcr;
     314
     315  read_reg(ctx, SC16IS752_MCR, &mcr, 1);
     316
     317  if (bits != NULL) {
     318    if ((*bits & TIOCM_DTR) == 0) {
     319      mcr |= MCR_DTR;
     320    } else {
     321      mcr &= ~MCR_DTR;
     322    }
     323
     324    if ((*bits & TIOCM_RTS) == 0) {
     325      mcr |= MCR_RTS;
     326    } else {
     327      mcr &= ~MCR_RTS;
     328    }
     329  }
     330
     331  if ((set & TIOCM_DTR) != 0) {
     332    mcr &= ~MCR_DTR;
     333  }
     334  if ((set & TIOCM_RTS) != 0) {
     335    mcr &= ~MCR_RTS;
     336  }
     337  if ((clear & TIOCM_DTR) != 0) {
     338    mcr |= MCR_DTR;
     339  }
     340  if ((clear & TIOCM_RTS) != 0) {
     341    mcr |= MCR_RTS;
     342  }
     343
     344  write_reg(ctx, SC16IS752_MCR, &mcr, 1);
     345}
     346
    280347static int sc16is752_ioctl(
    281348  rtems_termios_device_context *base,
     
    312379    case SC16IS752_GET_IOSTATE:
    313380      read_reg(ctx, SC16IS752_IOSTATE, (uint8_t *)buffer, 1);
     381      break;
     382    case TIOCMGET:
     383      sc16is752_get_modem_bits(ctx, (int *)buffer);
     384      break;
     385    case TIOCMSET:
     386      sc16is752_set_modem_bits(ctx, (int *)buffer, 0, 0);
     387      break;
     388    case TIOCMBIS:
     389      sc16is752_set_modem_bits(ctx, NULL, *(int *)buffer, 0);
     390      break;
     391    case TIOCMBIC:
     392      sc16is752_set_modem_bits(ctx, NULL, 0, *(int *)buffer);
    314393      break;
    315394    default:
Note: See TracChangeset for help on using the changeset viewer.