* [Xenomai-core] [16550A-PATCH] integer baud rate, type renaming
@ 2005-11-07 17:30 Jan Kiszka
2005-11-07 18:38 ` Jan Kiszka
0 siblings, 1 reply; 3+ messages in thread
From: Jan Kiszka @ 2005-11-07 17:30 UTC (permalink / raw)
To: xenomai-core
[-- Attachment #1.1: Type: text/plain, Size: 543 bytes --]
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.
Jan
[-- Attachment #1.2: rtser-baudrate-and-types.patch --]
[-- Type: text/plain, Size: 11853 bytes --]
Index: skins/rtdm/rtserial.h
===================================================================
--- skins/rtdm/rtserial.h (revision 112)
+++ skins/rtdm/rtserial.h (working copy)
@@ -77,38 +77,19 @@
#ifndef _RTSERIAL_H
#define _RTSERIAL_H
-#include <asm/types.h>
+#ifdef __KERNEL__
+# include <asm/types.h>
+#else
+# include <sys/types.h>
+#endif
+
#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 +240,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 +251,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 +284,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
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 250 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Xenomai-core] [16550A-PATCH] integer baud rate, type renaming
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
0 siblings, 1 reply; 3+ messages in thread
From: Jan Kiszka @ 2005-11-07 18:38 UTC (permalink / raw)
To: xenomai-core
[-- Attachment #1: Type: text/plain, Size: 819 bytes --]
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.
Jan
[-- Attachment #2: rtser-baudrate-and-types.patch2 --]
[-- Type: text/plain, Size: 11770 bytes --]
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
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Xenomai-core] [16550A-PATCH] integer baud rate, type renaming
2005-11-07 18:38 ` Jan Kiszka
@ 2005-11-08 9:50 ` Philippe Gerum
0 siblings, 0 replies; 3+ messages in thread
From: Philippe Gerum @ 2005-11-08 9:50 UTC (permalink / raw)
To: Jan Kiszka; +Cc: xenomai-core
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.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2005-11-08 9:50 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 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.