There are some issues with drivers in that book, infact my par_port driver
couldn't run because there was no interrupt generation. I am not sure
whether that is issue with driver or the h/w(which is  less likely).

I once sent a mail to Greg to update the book somewhere online or something
like that, but I guess the mail got lost in the huge chunk of mails he
receive.


-Anuz

On Thu, Oct 23, 2008 at 6:33 PM, luca ellero <[EMAIL PROTECTED]> wrote:

> Thank you Anuz,
> this link helped a lot. At least now I can compile the modules.
> Anyway I still couldn't get anything from the devices.
> I'm going now to investigate further. Any help is appreciated
>
> regards
>
> - Luca
>
>
> Anuz Pratap Singh Tomar wrote:
>
>> 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/<http://www.cs.fsu.edu/%7Ebaker/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] <mailto:
>> [EMAIL PROTECTED]>> wrote:
>>
>>    Hi everybody,
>>    I'm trying to compile the examples of LDD3 with kernel 2.6.22.
>>    <http://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]
>>    <mailto:[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]
>>    <mailto:[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]
>>    <mailto:[EMAIL PROTECTED]>
>>    Please read the FAQ at http://kernelnewbies.org/FAQ
>>
>>
>>
>
>

Reply via email to