Am Mittwoch 05 Januar 2011, 20:55:29 schrieb Jan Kiszka: > Am 05.01.2011 20:40, Stefan Kisdaroczi wrote: > > Am Dienstag 04 Januar 2011, 20:49:59 schrieben Sie: > >> Stefan Kisdaroczi wrote: > >>> Hi, > >>> > >>> the attached patch adds pci support to the 16550A serial driver. I have > >>> a Moxa CP-132 board and the first tests are looking good. If there is a > >>> chance to get the patch applied I kindly request you to review it. I'll > >>> add support for more Moxa boards if there is a interest to apply the > >>> patch. > >>> > >>> thanks > >>> Stefan > >> > >> Looks fine to me, however, nit-picking a bit, could we do this differently: > > new patches attached. > > Looks good to me as well except for a minor white space damage: > > +static int __devinit rt_16550_pci_probe( struct pci_dev *pdev, > > ^^^^^^^ > > I have one further suggestion which can be done on top: The RTDM_IRQTYPE > flags should be customized as well. So far we assume edge-type devices, > but PCI is level-triggered. Requesting edge works, but is suboptimal. > > Jan
thanks for the input. updated patches attached with customizable irqtype. better? (not compiled and not tested -> tomorrow) Stefan
From b657b7534e2fadbfd95b7f3eda2f6f7753649e5d Mon Sep 17 00:00:00 2001 From: Stefan Kisdaroczi <[email protected]> Date: Wed, 5 Jan 2011 22:30:36 +0100 Subject: [PATCH 1/3] 16550A: customizable irqtype --- ksrc/drivers/serial/16550A.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ksrc/drivers/serial/16550A.c b/ksrc/drivers/serial/16550A.c index 4c46d86..ba6850f 100644 --- a/ksrc/drivers/serial/16550A.c +++ b/ksrc/drivers/serial/16550A.c @@ -119,6 +119,7 @@ static const struct rtser_config default_config = { static struct rtdm_device *device[MAX_DEVICES]; static unsigned int irq[MAX_DEVICES]; +static unsigned long irqtype[MAX_DEVICES]; static unsigned int baud_base[MAX_DEVICES]; static int tx_fifo[MAX_DEVICES]; static unsigned int start_index; @@ -478,8 +479,7 @@ int rt_16550_open(struct rtdm_dev_context *context, rt_16550_set_config(ctx, &default_config, &dummy); err = rtdm_irq_request(&ctx->irq_handle, irq[dev_id], - rt_16550_interrupt, - RTDM_IRQTYPE_SHARED | RTDM_IRQTYPE_EDGE, + rt_16550_interrupt, irqtype[i], context->device->proc_name, ctx); if (err) { /* reset DTR and RTS */ @@ -1118,6 +1118,9 @@ int __init rt_16550_init(void) int err; int i; + for (i = 0; i < MAX_DEVICES; i++) + irqtype[i] = RTDM_IRQTYPE_SHARED | RTDM_IRQTYPE_EDGE; + rt_16550_pnp_init(); for (i = 0; i < MAX_DEVICES; i++) { -- 1.7.2.3
From 978c5f5e804801d193855dd047e589570a477984 Mon Sep 17 00:00:00 2001 From: Stefan Kisdaroczi <[email protected]> Date: Wed, 5 Jan 2011 22:38:15 +0100 Subject: [PATCH 2/3] 16550A: pci support --- ksrc/drivers/serial/16550A.c | 3 + ksrc/drivers/serial/16550A_pci.h | 110 ++++++++++++++++++++++++++++++++++++++ ksrc/drivers/serial/Kconfig | 8 +++ 3 files changed, 121 insertions(+), 0 deletions(-) create mode 100644 ksrc/drivers/serial/16550A_pci.h diff --git a/ksrc/drivers/serial/16550A.c b/ksrc/drivers/serial/16550A.c index ba6850f..4d35f2d 100644 --- a/ksrc/drivers/serial/16550A.c +++ b/ksrc/drivers/serial/16550A.c @@ -141,6 +141,7 @@ MODULE_AUTHOR("[email protected]"); #include "16550A_io.h" #include "16550A_pnp.h" +#include "16550A_pci.h" static inline int rt_16550_rx_interrupt(struct rt_16550_context *ctx, uint64_t * timestamp) @@ -1122,6 +1123,7 @@ int __init rt_16550_init(void) irqtype[i] = RTDM_IRQTYPE_SHARED | RTDM_IRQTYPE_EDGE; rt_16550_pnp_init(); + rt_16550_pci_init(); for (i = 0; i < MAX_DEVICES; i++) { if (!rt_16550_addr_param(i)) @@ -1195,6 +1197,7 @@ void rt_16550_exit(void) kfree(device[i]); } + rt_16550_pci_cleanup(); rt_16550_pnp_cleanup(); } diff --git a/ksrc/drivers/serial/16550A_pci.h b/ksrc/drivers/serial/16550A_pci.h new file mode 100644 index 0000000..5fd4e10 --- /dev/null +++ b/ksrc/drivers/serial/16550A_pci.h @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2006-2007 Jan Kiszka <[email protected]>. + * Copyright (C) 2011 Stefan Kisdaroczi <[email protected]>. + * + * Xenomai is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Xenomai is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xenomai; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && defined(CONFIG_PCI) && \ + defined(CONFIG_XENO_DRIVERS_16550A_PCI) + +#include <linux/pci.h> + +struct rt_16550_pci_board { + char *name; + resource_size_t resource_base_addr; + unsigned int nports; + unsigned int port_ofs; + unsigned long irqtype; + unsigned int baud_base; + int tx_fifo; +}; + +DEFINE_PCI_DEVICE_TABLE( rt_16550_pci_table ) = { + { } +}; + +static int __devinit rt_16550_pci_probe( struct pci_dev *pdev, + const struct pci_device_id *ent ) +{ + struct rt_16550_pci_board *board; + int err; + int i; + int port = 0; + int base_addr; + int max_devices = 0; + + if (!ent->driver_data) + return -ENODEV; + + board = (struct rt_16550_pci_board *)ent->driver_data; + + for (i = 0; i < MAX_DEVICES; i++) + if (!rt_16550_addr_param(i)) + max_devices++; + + if (board->nports > max_devices) + return -ENODEV; + + if (err = pci_enable_device(pdev)) + return err; + + base_addr = pci_resource_start(pdev, board->resource_base_addr); + + for (i = 0; i < MAX_DEVICES; i++) { + if ((port < board->nports) && (!rt_16550_addr_param(i))) { + io[i] = base_addr + port * board->port_ofs; + irq[i] = pdev->irq; + irqtype[i] = board->irqtype; + baud_base[i] = board->baud_base; + tx_fifo[i] = board->tx_fifo; + port++; + } + } + + return 0; +} + +static void __devexit rt_16550_pci_remove( struct pci_dev *pdev ) { + pci_disable_device( pdev ); +}; + +static struct pci_driver rt_16550_pci_driver = { + .name = RT_16550_DRIVER_NAME, + .id_table = rt_16550_pci_table, + .probe = rt_16550_pci_probe, + .remove = __devexit_p(rt_16550_pci_remove) +}; + +static int pci_registered; + +static inline void rt_16550_pci_init(void) +{ + if (pci_register_driver(&rt_16550_pci_driver) == 0) + pci_registered = 1; +} + +static inline void rt_16550_pci_cleanup(void) +{ + if (pci_registered) + pci_unregister_driver(&rt_16550_pci_driver); +} + +#else /* Linux < 2.6.0 || !CONFIG_PCI || !(..._16550A_PCI */ + +#define rt_16550_pci_init() do { } while (0) +#define rt_16550_pci_cleanup() do { } while (0) + +#endif /* Linux < 2.6.0 || !CONFIG_PCI || !(..._16550A_PCI */ diff --git a/ksrc/drivers/serial/Kconfig b/ksrc/drivers/serial/Kconfig index afbaabf..b468fbc 100644 --- a/ksrc/drivers/serial/Kconfig +++ b/ksrc/drivers/serial/Kconfig @@ -39,4 +39,12 @@ config XENO_DRIVERS_16550A_ANY endchoice +config XENO_DRIVERS_16550A_PCI + depends on XENO_DRIVERS_16550A_PIO || XENO_DRIVERS_16550A_ANY + bool "PCI board support" + default n + help + + This option activates support for PCI serial boards. + endmenu -- 1.7.2.3
From 44fb442f3f91af9b5558203cd892f843dfce01e2 Mon Sep 17 00:00:00 2001 From: Stefan Kisdaroczi <[email protected]> Date: Wed, 5 Jan 2011 22:49:25 +0100 Subject: [PATCH 3/3] 16550A: Moxa pci board support --- ksrc/drivers/serial/16550A_pci.h | 177 ++++++++++++++++++++++++++++++++++++++ ksrc/drivers/serial/Kconfig | 16 ++++ 2 files changed, 193 insertions(+), 0 deletions(-) diff --git a/ksrc/drivers/serial/16550A_pci.h b/ksrc/drivers/serial/16550A_pci.h index 5fd4e10..17777ff 100644 --- a/ksrc/drivers/serial/16550A_pci.h +++ b/ksrc/drivers/serial/16550A_pci.h @@ -32,7 +32,184 @@ struct rt_16550_pci_board { int tx_fifo; }; +#if defined(CONFIG_XENO_DRIVERS_16550A_PCI_MOXA) + +#define PCI_DEVICE_ID_CP112UL 0x1120 +#define PCI_DEVICE_ID_CP114UL 0x1143 +#define PCI_DEVICE_ID_CP138U 0x1380 + +static const struct rt_16550_pci_board rt_16550_moxa_c104 = { + .name = "Moxa C104H/PCI", + .resource_base_addr = 2, + .nports = 4, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_c168 = { + .name = "Moxa C168H/PCI", + .resource_base_addr = 2, + .nports = 8, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp114 = { + .name = "Moxa CP-114", + .resource_base_addr = 2, + .nports = 4, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp132 = { + .name = "Moxa CP-132", + .resource_base_addr = 2, + .nports = 2, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp102u = { + .name = "Moxa CP-102U", + .resource_base_addr = 2, + .nports = 2, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp102ul = { + .name = "Moxa CP-102UL", + .resource_base_addr = 2, + .nports = 2, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp104u = { + .name = "Moxa CP-104U", + .resource_base_addr = 2, + .nports = 4, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp112ul = { + .name = "Moxa CP-112UL", + .resource_base_addr = 2, + .nports = 2, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp114ul = { + .name = "Moxa CP-114UL", + .resource_base_addr = 2, + .nports = 4, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp118u = { + .name = "Moxa CP-118U", + .resource_base_addr = 2, + .nports = 8, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp132u = { + .name = "Moxa CP-132U", + .resource_base_addr = 2, + .nports = 2, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp134u = { + .name = "Moxa CP-134U", + .resource_base_addr = 2, + .nports = 4, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp138u = { + .name = "Moxa CP-138U", + .resource_base_addr = 2, + .nports = 8, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp168u = { + .name = "Moxa CP-168U", + .resource_base_addr = 2, + .nports = 8, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, + .irqtype = RTDM_IRQTYPE_SHARED, +}; +#endif + DEFINE_PCI_DEVICE_TABLE( rt_16550_pci_table ) = { +#if defined(CONFIG_XENO_DRIVERS_16550A_PCI_MOXA) + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_C104), + .driver_data = &rt_16550_moxa_c104}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_C168), + .driver_data = &rt_16550_moxa_c168}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114), + .driver_data = &rt_16550_moxa_cp114}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132), + .driver_data = &rt_16550_moxa_cp132}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102U), + .driver_data = &rt_16550_moxa_cp102u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102UL), + .driver_data = &rt_16550_moxa_cp102ul}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104U), + .driver_data = &rt_16550_moxa_cp104u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP112UL), + .driver_data = &rt_16550_moxa_cp112ul}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP114UL), + .driver_data = &rt_16550_moxa_cp114ul}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118U), + .driver_data = &rt_16550_moxa_cp118u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132U), + .driver_data = &rt_16550_moxa_cp132u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP134U), + .driver_data = &rt_16550_moxa_cp134u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP138U), + .driver_data = &rt_16550_moxa_cp138u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP168U), + .driver_data = &rt_16550_moxa_cp168u}, +#endif { } }; diff --git a/ksrc/drivers/serial/Kconfig b/ksrc/drivers/serial/Kconfig index b468fbc..d3c100e 100644 --- a/ksrc/drivers/serial/Kconfig +++ b/ksrc/drivers/serial/Kconfig @@ -47,4 +47,20 @@ config XENO_DRIVERS_16550A_PCI This option activates support for PCI serial boards. +config XENO_DRIVERS_16550A_PCI_MOXA + depends on XENO_DRIVERS_16550A_PCI + bool "Moxa PCI boards" + default n + help + + This option activates support for the following Moxa boards: + PCI Serial Boards: + C104H/PCI, C168H/PCI + CP-114, CP-132 + Universal PCI Serial Boards: + CP-102U, CP-102UL, CP-104U + CP-112UL, CP-114UL, CP-118U + CP-132U, CP-134U, CP-138U + CP-168U + endmenu -- 1.7.2.3
_______________________________________________ Xenomai-help mailing list [email protected] https://mail.gna.org/listinfo/xenomai-help
