hi there, Since API have changed so much, you need to change the code in accordance. I was having some problem for all drivers i was compiling with my .23 kernel
there is this guy who have updated all drivers for .25 kernel at this link: http://www.cs.fsu.edu/~baker/devices/lxr/source/2.6.25/ldd-examples/ Hope this helps -Anuz On Wed, Oct 22, 2008 at 4:01 PM, luca ellero <[EMAIL PROTECTED]> wrote: > Hi everybody, > I'm trying to compile the examples of LDD3 with kernel 2.6.22. > I get them from: > > http://www.oreilly.com.cn/codeexample/ldd3/ > > I have some problems/questions regarding tiny_tty.c and tiny_serial.c (tty > directory concerning chapter 18) > > 1) Are they tty or uart drivers? What is the main difference between the > two? > 2) I managed to compile tiny_serial.c, with some modifications to the > source (which I've reported at the end of my e-mail), but when I "cat > /dev/ttytiny" nothing happens (I would expect to get the 't' char every 2 > sec). With some printk I can see that the tiny_timer is running fine but it > seems that the characters aren't pushed to user space. > 3) I can't even compile tiny_tty.c. It seems the problem is in the change > of the flip buffer implementation but I can find a good example of using > this new code. > > Thank you very much > regards > Luca > > --------------------------------------------------------- > > /* > * Tiny Serial driver > * > * Copyright (C) 2002-2004 Greg Kroah-Hartman ([EMAIL PROTECTED]) > * > * This program 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, version 2 of the License. > * > * This driver shows how to create a minimal serial driver. It does not > rely on > * any backing hardware, but creates a timer that emulates data being > received > * from some kind of hardware. > */ > > #include <linux/kernel.h> > #include <linux/errno.h> > #include <linux/init.h> > #include <linux/slab.h> > #include <linux/tty.h> > #include <linux/tty_flip.h> > #include <linux/serial.h> > #include <linux/serial_core.h> > #include <linux/module.h> > > > #define DRIVER_AUTHOR "Greg Kroah-Hartman <[EMAIL PROTECTED]>" > #define DRIVER_DESC "Tiny serial driver" > > /* Module information */ > MODULE_AUTHOR( DRIVER_AUTHOR ); > MODULE_DESCRIPTION( DRIVER_DESC ); > MODULE_LICENSE("GPL"); > > #define DELAY_TIME HZ * 2 /* 2 seconds per character */ > #define TINY_DATA_CHARACTER 't' > > #define TINY_SERIAL_MAJOR 240 /* experimental range */ > #define TINY_SERIAL_MINORS 1 /* only have one minor */ > #define UART_NR 1 /* only use one port */ > > #define TINY_SERIAL_NAME "ttytiny" > > #define MY_NAME TINY_SERIAL_NAME > > static struct timer_list *timer; > > static void tiny_stop_tx(struct uart_port *port) > { > } > > static void tiny_stop_rx(struct uart_port *port) > { > } > > static void tiny_enable_ms(struct uart_port *port) > { > } > > static void tiny_tx_chars(struct uart_port *port) > { > struct circ_buf *xmit = &port->info->xmit; > int count; > > if (port->x_char) { > pr_debug("wrote %2x", port->x_char); > port->icount.tx++; > port->x_char = 0; > return; > } > if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { > tiny_stop_tx(port); > return; > } > > count = port->fifosize >> 1; > do { > pr_debug("wrote %2x", xmit->buf[xmit->tail]); > xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); > port->icount.tx++; > if (uart_circ_empty(xmit)) > break; > } while (--count > 0); > > if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) > uart_write_wakeup(port); > > if (uart_circ_empty(xmit)) > tiny_stop_tx(port); > } > > static void tiny_start_tx(struct uart_port *port) > { > } > > static void tiny_timer(unsigned long data) > { > struct uart_port *port; > struct tty_struct *tty; > > > port = (struct uart_port *)data; > if (!port) > return; > if (!port->info) > return; > tty = port->info->tty; > if (!tty) > return; > > /* add one character to the tty port */ > /* this doesn't actually push the data through unless > tty->low_latency is set */ > tty_insert_flip_char(tty, TINY_DATA_CHARACTER, 0); > > tty_flip_buffer_push(tty); > > /* resubmit the timer again */ > timer->expires = jiffies + DELAY_TIME; > add_timer(timer); > > /* see if we have any data to transmit */ > tiny_tx_chars(port); > } > > static unsigned int tiny_tx_empty(struct uart_port *port) > { > return 0; > } > > static unsigned int tiny_get_mctrl(struct uart_port *port) > { > return 0; > } > > static void tiny_set_mctrl(struct uart_port *port, unsigned int mctrl) > { > } > > static void tiny_break_ctl(struct uart_port *port, int break_state) > { > } > > static void tiny_set_termios(struct uart_port *port, > struct ktermios *new, struct ktermios *old) > { > // int baud, quot, > int cflag = new->c_cflag; > /* get the byte size */ > switch (cflag & CSIZE) { > case CS5: > printk(KERN_DEBUG " - data bits = 5\n"); > break; > case CS6: > printk(KERN_DEBUG " - data bits = 6\n"); > break; > case CS7: > printk(KERN_DEBUG " - data bits = 7\n"); > break; > default: // CS8 > printk(KERN_DEBUG " - data bits = 8\n"); > break; > } > > /* determine the parity */ > if (cflag & PARENB) > if (cflag & PARODD) > pr_debug(" - parity = odd\n"); > else > pr_debug(" - parity = even\n"); > else > pr_debug(" - parity = none\n"); > > /* figure out the stop bits requested */ > if (cflag & CSTOPB) > pr_debug(" - stop bits = 2\n"); > else > pr_debug(" - stop bits = 1\n"); > > /* figure out the flow control settings */ > if (cflag & CRTSCTS) > pr_debug(" - RTS/CTS is enabled\n"); > else > pr_debug(" - RTS/CTS is disabled\n"); > > /* Set baud rate */ > // baud = uart_get_baud_rate(port, new, old, 0, port->uartclk/16); > // quot = uart_get_divisor(port, baud); > > //UART_PUT_DIV_LO(port, (quot & 0xff)); > //UART_PUT_DIV_HI(port, ((quot & 0xf00) >> 8)); > } > > static int tiny_startup(struct uart_port *port) > { > /* this is the first time this port is opened */ > /* do any hardware initialization needed here */ > > /* create our timer and submit it */ > if (!timer) { > timer = kmalloc(sizeof(*timer), GFP_KERNEL); > if (!timer) > return -ENOMEM; > } > init_timer(timer); > timer->data = (unsigned long)port; > timer->expires = jiffies + DELAY_TIME; > timer->function = tiny_timer; > add_timer(timer); > return 0; > } > > static void tiny_shutdown(struct uart_port *port) > { > /* The port is being closed by the last user. */ > /* Do any hardware specific stuff here */ > > /* shut down our timer */ > del_timer(timer); > } > > static const char *tiny_type(struct uart_port *port) > { > return "tinytty"; > } > > static void tiny_release_port(struct uart_port *port) > { > > } > > static int tiny_request_port(struct uart_port *port) > { > return 0; > } > > static void tiny_config_port(struct uart_port *port, int flags) > { > } > > static int tiny_verify_port(struct uart_port *port, struct serial_struct > *ser) > { > return 0; > } > > static struct uart_ops tiny_ops = { > .tx_empty = tiny_tx_empty, > .set_mctrl = tiny_set_mctrl, > .get_mctrl = tiny_get_mctrl, > .stop_tx = tiny_stop_tx, > .start_tx = tiny_start_tx, > .stop_rx = tiny_stop_rx, > .enable_ms = tiny_enable_ms, > .break_ctl = tiny_break_ctl, > .startup = tiny_startup, > .shutdown = tiny_shutdown, > .set_termios = tiny_set_termios, > .type = tiny_type, > .release_port = tiny_release_port, > .request_port = tiny_request_port, > .config_port = tiny_config_port, > .verify_port = tiny_verify_port, > }; > > static struct uart_port tiny_port = { > .ops = &tiny_ops, > }; > > static struct uart_driver tiny_reg = { > .owner = THIS_MODULE, > .driver_name = TINY_SERIAL_NAME, > .dev_name = TINY_SERIAL_NAME, > .major = TINY_SERIAL_MAJOR, > .minor = TINY_SERIAL_MINORS, > .nr = UART_NR, > }; > > static int __init tiny_init(void) > { > int result; > > printk(KERN_INFO "Tiny serial driver loaded\n"); > > result = uart_register_driver(&tiny_reg); > if (result) > return result; > > tiny_port.type = PORT_16550A; > > > result = uart_add_one_port(&tiny_reg, &tiny_port); > if (result) > uart_unregister_driver(&tiny_reg); > > return result; > } > > static void __exit tiny_exit(void) > { > uart_remove_one_port(&tiny_reg, &tiny_port); > uart_unregister_driver(&tiny_reg); > > } > > module_init(tiny_init); > module_exit(tiny_exit); > > > -- > To unsubscribe from this list: send an email with > "unsubscribe kernelnewbies" to [EMAIL PROTECTED] > Please read the FAQ at http://kernelnewbies.org/FAQ > >
