All of lore.kernel.org
 help / color / mirror / Atom feed
From: Philippe Gerum <rpm@xenomai.org>
To: Jan Kiszka <kiszka@domain.hid>
Cc: xenomai-core <xenomai@xenomai.org>
Subject: Re: [Xenomai-core] [16550A-PATCH] integer baud rate, type renaming
Date: Tue, 08 Nov 2005 10:50:48 +0100	[thread overview]
Message-ID: <437074F8.6020003@domain.hid> (raw)
In-Reply-To: <436F9F3F.3010405@domain.hid>

Jan Kiszka wrote:
> Jan Kiszka wrote:
> 
>>Hi all,
>>
>>and another patch: This one changes the rtserial API so that the baud
>>rate can now be provided as an integer instead of the previous low-level
>>encoded value. The baud base of a device is provided as module parameter
>>to the driver on insmod. Turned out that I specified a not very useful
>>interface in this regard. Moreover, this patch also moves to
>>int64_t/uint64_t types.
>>
>>No regressions known, except that existing applications need a tiny
>>patch for setting the baud rate according to the new format. Please apply.
>>
> 
> 
> There was a regression in user space due to the int64_t/uint64_t types.
> The attached patch addresses this in rtdm/rtdm.h by including inttypes.h
> - no need for the device profile header to care about this anymore.
> 
> Please apply THIS one instead.

Applied, thanks.

> 
> Jan
> 
> 
> ------------------------------------------------------------------------
> 
> Index: skins/rtdm/rtdm.h
> ===================================================================
> --- skins/rtdm/rtdm.h	(revision 112)
> +++ skins/rtdm/rtdm.h	(working copy)
> @@ -48,6 +48,7 @@
>  #else  /* !__KERNEL__ */
>  
>  #include <fcntl.h>
> +#include <inttypes.h>
>  #include <sys/ioctl.h>
>  #include <sys/socket.h>
>  
> Index: skins/rtdm/rtserial.h
> ===================================================================
> --- skins/rtdm/rtserial.h	(revision 112)
> +++ skins/rtdm/rtserial.h	(working copy)
> @@ -77,38 +77,13 @@
>  #ifndef _RTSERIAL_H
>  #define _RTSERIAL_H
>  
> -#include <asm/types.h>
>  #include <rtdm/rtdm.h>
>  
>  /*!
> - * @anchor RTSER_xxx_BAUD   @name RTSER_xxx_BAUD
> - * Baud rates
> + * @anchor RTSER_DEF_BAUD   @name RTSER_DEF_BAUD
> + * Default baud rate
>   * @{ */
> -#define RTSER_50_BAUD               2304
> -#define RTSER_75_BAUD               1536
> -#define RTSER_110_BAUD              1047
> -#define RTSER_134_5_BAUD            857
> -#define RTSER_150_BAUD              768
> -#define RTSER_300_BAUD              384
> -#define RTSER_600_BAUD              192
> -#define RTSER_1200_BAUD             96
> -#define RTSER_2400_BAUD             48
> -#define RTSER_3600_BAUD             32
> -#define RTSER_4800_BAUD             24
> -#define RTSER_7200_BAUD             16
> -#define RTSER_9600_BAUD             12
> -#define RTSER_19200_BAUD            6
> -#define RTSER_38400_BAUD            3
> -#define RTSER_57600_BAUD            2
> -#define RTSER_115200_BAUD           1
> -#define RTSER_DEF_BAUD              RTSER_9600_BAUD
> -
> -/** Generate customised baud rate code
> - * @param base UART clock base
> - * @param rate baud rate
> - */
> -#define RTSER_CUSTOM_BAUD(base, rate) \
> -    ((base + (rate >> 1)) / rate)
> +#define RTSER_DEF_BAUD              9600
>  /** @} */
>  
>  /*!
> @@ -259,7 +234,7 @@
>  typedef struct rtser_config {
>      int     config_mask;        /**< mask specifying valid fields,
>                                   *   see @ref RTSER_SET_xxx */
> -    int     baud_rate;          /**< baud rate, see @ref RTSER_xxx_BAUD */
> +    int     baud_rate;          /**< baud rate, default @ref RTSER_DEF_BAUD */
>      int     parity;             /**< number of parity bits, see
>                                   *   @ref RTSER_xxx_PARITY */
>      int     data_bits;          /**< number of data bits, see
> @@ -270,13 +245,13 @@
>                                   *   @ref RTSER_xxx_HAND */
>      int     fifo_depth;         /**< reception FIFO interrupt threshold, see
>                                   *   @ref RTSER_FIFO_xxx */
> -    __s64   rx_timeout;         /**< reception timeout in ns, see
> +    int64_t rx_timeout;         /**< reception timeout in ns, see
>                                   *   @ref RTSER_TIMEOUT_xxx for special
>                                   *   values */
> -    __s64   tx_timeout;         /**< transmission timeout in ns, see
> +    int64_t tx_timeout;         /**< transmission timeout in ns, see
>                                   *   @ref RTSER_TIMEOUT_xxx for special
>                                   *   values */
> -    __s64   event_timeout;      /**< event timeout in ns, see
> +    int64_t event_timeout;      /**< event timeout in ns, see
>                                   *   @ref RTSER_TIMEOUT_xxx for special
>                                   *   values */
>      int     timestamp_history;  /**< enable timestamp history, see
> @@ -303,9 +278,9 @@
>      int     events;             /**< signalled events, see
>                                   *   @ref RTSER_EVENT_xxx */
>      int     rx_pending;         /**< number of pending input characters */
> -    __u64   last_timestamp;     /**< last interrupt timestamp (absolute time
> +    uint64_t last_timestamp;    /**< last interrupt timestamp (absolute time
>                                   *   in ns) */
> -    __u64   rxpend_timestamp;   /**< reception timestamp (absolute time in ns)
> +    uint64_t rxpend_timestamp;  /**< reception timestamp (absolute time in ns)
>                                   *   of oldest character in input queue */
>  } rtser_event_t;
>  
> Index: drivers/16550A/16550A.c
> ===================================================================
> --- drivers/16550A/16550A.c	(revision 112)
> +++ drivers/16550A/16550A.c	(working copy)
> @@ -29,9 +29,9 @@
>  #define IN_BUFFER_SIZE      4096
>  #define OUT_BUFFER_SIZE     4096
>  
> +#define DEFAULT_BAUD_BASE   115200
>  #define DEFAULT_TX_FIFO     16
>  
> -#define BAUD_MASK           0xFFFF
>  #define PARITY_MASK         0x03
>  #define DATA_BITS_MASK      0x03
>  #define STOP_BITS_MASK      0x01
> @@ -84,7 +84,7 @@
>      rtdm_event_t            in_event;
>      char                    in_buf[IN_BUFFER_SIZE];
>      volatile unsigned long  in_lock;
> -    u64                     *in_history;
> +    uint64_t                *in_history;
>  
>      int                     out_head;
>      int                     out_tail;
> @@ -93,7 +93,7 @@
>      char                    out_buf[OUT_BUFFER_SIZE];
>      rtdm_mutex_t            out_lock;
>  
> -    u64                     last_timestamp;
> +    uint64_t                last_timestamp;
>      volatile int            ioc_events;
>      rtdm_event_t            ioc_event;
>      volatile unsigned long  ioc_event_lock;
> @@ -117,6 +117,8 @@
>  static int                  ioaddr_c;
>  static unsigned int         irq[MAX_DEVICES];
>  static int                  irq_c;
> +static unsigned int         baud_base[MAX_DEVICES];
> +static int                  baud_base_c;
>  static int                  tx_fifo[MAX_DEVICES];
>  static int                  tx_fifo_c;
>  static unsigned int         start_index;
> @@ -125,6 +127,9 @@
>  MODULE_PARM_DESC(ioaddr, "I/O addresses of the serial devices");
>  module_param_array(irq, uint, &irq_c, 0400);
>  MODULE_PARM_DESC(irq, "IRQ numbers of the serial devices");
> +module_param_array(baud_base, uint, &baud_base_c, 0400);
> +MODULE_PARM_DESC(baud_base,
> +    "Maximum baud rate of the serial device (internal clock rate / 16)");
>  module_param_array(tx_fifo, int, &tx_fifo_c, 0400);
>  MODULE_PARM_DESC(tx_fifo, "Transmitter FIFO size");
>  module_param(start_index, uint, 0400);
> @@ -135,7 +140,7 @@
>  
>  
>  static inline int rt_16550_rx_interrupt(struct rt_16550_context *ctx,
> -                                        u64 *timestamp)
> +                                        uint64_t *timestamp)
>  {
>      int dev_id = ctx->dev_id;
>      int rbytes = 0;
> @@ -219,7 +224,7 @@
>      struct rt_16550_context *ctx;
>      int                     dev_id;
>      int                     iir;
> -    u64                     timestamp = rtdm_clock_read();
> +    uint64_t                timestamp = rtdm_clock_read();
>      int                     rbytes = 0;
>      int                     events = 0;
>      int                     modem;
> @@ -297,11 +302,12 @@
>  
>  static int rt_16550_set_config(struct rt_16550_context *ctx,
>                                 const struct rtser_config *config,
> -                               u64 **in_history_ptr)
> +                               uint64_t **in_history_ptr)
>  {
>      rtdm_lockctx_t  lock_ctx;
>      int             dev_id;
>      int             ret = 0;
> +    int             baud_div = 0;
>  
>  
>      dev_id = ctx->dev_id;
> @@ -310,11 +316,12 @@
>      rtdm_lock_get_irqsave(&ctx->lock, lock_ctx);
>  
>      if (testbits(config->config_mask, RTSER_SET_BAUD)) {
> -        ctx->config.baud_rate = config->baud_rate & BAUD_MASK;
> -
> -        outb(LCR_DLAB,                           LCR(dev_id));
> -        outb(ctx->config.baud_rate & 0xff, DLL(dev_id));
> -        outb(ctx->config.baud_rate >> 8,   DLM(dev_id));
> +        ctx->config.baud_rate = config->baud_rate;
> +        baud_div = (baud_base[dev_id] + (ctx->config.baud_rate >> 1)) /
> +                   ctx->config.baud_rate;
> +        outb(LCR_DLAB,        LCR(dev_id));
> +        outb(baud_div & 0xff, DLL(dev_id));
> +        outb(baud_div >> 8,   DLM(dev_id));
>      }
>  
>      if (testbits(config->config_mask, RTSER_SET_PARITY))
> @@ -423,7 +430,7 @@
>      struct rt_16550_context *ctx;
>      int                     dev_id = context->device->device_id;
>      int                     ret;
> -    __u64                   *dummy;
> +    uint64_t                *dummy;
>  
>  
>      ctx = (struct rt_16550_context *)context->dev_private;
> @@ -473,7 +480,7 @@
>  {
>      struct rt_16550_context *ctx;
>      int                     dev_id;
> -    u64                     *in_history;
> +    uint64_t                *in_history;
>      rtdm_lockctx_t          lock_ctx;
>  
>  
> @@ -521,6 +528,7 @@
>  {
>      struct rt_16550_context *ctx;
>      int                     ret = 0;
> +    int                     dev_id = context->device->device_id;
>  
>  
>      ctx = (struct rt_16550_context *)context->dev_private;
> @@ -541,7 +549,7 @@
>          case RTSER_RTIOC_SET_CONFIG: {
>              struct rtser_config *config;
>              struct rtser_config config_buf;
> -            __u64               *hist_buf = NULL;
> +            uint64_t            *hist_buf = NULL;
>  
>              config = (struct rtser_config *)arg;
>  
> @@ -556,6 +564,12 @@
>                  config = &config_buf;
>              }
>  
> +            if (testbits(config->config_mask, RTSER_SET_BAUD) &&
> +                (config->baud_rate > baud_base[dev_id])) {
> +                /* the baudrate is to high for this port */
> +                return -EINVAL;
> +            }
> +
>              if (testbits(config->config_mask, RTSER_SET_TIMESTAMP_HISTORY)) {
>                  if (test_bit(RTDM_CREATED_IN_NRT, &context->context_flags) &&
>                      rtdm_in_rt_context()) {
> @@ -568,11 +582,11 @@
>                               RTSER_RX_TIMESTAMP_HISTORY)) {
>                      if (test_bit(RTDM_CREATED_IN_NRT,
>                                   &context->context_flags))
> -                        hist_buf = kmalloc(IN_BUFFER_SIZE * sizeof(__u64),
> +                        hist_buf = kmalloc(IN_BUFFER_SIZE * sizeof(uint64_t),
>                                             GFP_KERNEL);
>                      else
>                          hist_buf =
> -                            rtdm_malloc(IN_BUFFER_SIZE * sizeof(__u64));
> +                            rtdm_malloc(IN_BUFFER_SIZE * sizeof(uint64_t));
>                  }
>  
>                  if (!hist_buf)
> @@ -1011,7 +1025,7 @@
>      device_class:       RTDM_CLASS_SERIAL,
>      device_sub_class:   RTDM_SUBCLASS_16550A,
>      driver_name:        "rt_16550A",
> -    driver_version:     RTDM_DRIVER_VER(1, 1, 2),
> +    driver_version:     RTDM_DRIVER_VER(1, 2, 0),
>      peripheral_name:    "UART 16550A",
>      provider_name:      "Jan Kiszka",
>  };
> @@ -1043,6 +1057,9 @@
>          if (!request_region(ioaddr[i], 8, dev->device_name))
>              goto kfree_out;
>  
> +        if (baud_base[i] == 0)
> +            baud_base[i] = DEFAULT_BAUD_BASE;
> +
>          if (tx_fifo[i] == 0)
>              tx_fifo[i] = DEFAULT_TX_FIFO;
>  
> Index: drivers/16550A/README
> ===================================================================
> --- drivers/16550A/README	(revision 112)
> +++ drivers/16550A/README	(working copy)
> @@ -1,6 +1,9 @@
>  Real-Time Serial Driver for 16550A-Compatible Devices
>  =====================================================
>  
> +Driver revision: 1.2.0
> +
> +
>  Preparation
>  -----------
>   - decide which serial ports are to be managed by the real-time driver
> @@ -18,6 +21,7 @@
>  ----------
>  
>  modprobe xeno_16550A ioaddr=<io1>[,<io2>...] irq=<irq1>[,<irq2>...]
> +                     [baud_base=<base1>[,<base2>...]]
>                       [tx_fifo=<len1>[,<len2>...]] [start_index=<index>]
>  
>  Arguments:
> @@ -25,6 +29,8 @@
>                    (e.g. "0x3f8,0x2f8")
>      irq         - interrupt numbers of the devices, comma separated
>                    (e.g. "4,3")
> +    baud_base   - Maximum baud rates of the devices, comma separated, default
> +                  is 115200
>      tx_fifo     - Transmitter FIFO sizes of the devices in bytes, comma
>                    separated, default is 16
>      start_index - First device instance number to be used, default is 0
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Xenomai-core mailing list
> Xenomai-core@domain.hid
> https://mail.gna.org/listinfo/xenomai-core


-- 

Philippe.


      reply	other threads:[~2005-11-08  9:50 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-07 17:30 [Xenomai-core] [16550A-PATCH] integer baud rate, type renaming Jan Kiszka
2005-11-07 18:38 ` Jan Kiszka
2005-11-08  9:50   ` Philippe Gerum [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=437074F8.6020003@domain.hid \
    --to=rpm@xenomai.org \
    --cc=kiszka@domain.hid \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.