Linux.com

BenjaminD

BenjaminD

  • Linux.com Member
  • Posts: 6
  • Member Since: 13 Sep 10
  • Last Logged In: 10 Oct 10

Latest Posts

Posted by
Topic
Post Preview
Posted
  • BenjaminD
    Parallel port driver not working?!
    Hello everyone! I've been doing some kernel module development for Linux lately, and I figured: Why not make a 6V LED light up? So I hooked up to wires with the LED and plugged the wires into hole/pin 2 and 25 (data0 and GND respectively) of my parallel port. Now all I needed was the device driver.. now the device driver is done..... it's not working. I have tested my homegrown "LED hardware" standalone with a 1.5V battery, which did make the LED glow slightly, so the 5V of the parallel port should definitely make it glow! I have made a virtual device using 'mknod' to communicate with the parallel port at 0x378 (confirmed, by the way). This is my mknod command: "sudo mknod /dev/parlelport c 61 0", and finally, to make the "device" accessible to anyone: "sudo chmod 666 /dev/parlelport". I can not insert the module with parport_pc running, so I remove that and the modules using it, before I 'insmod' my kernel module, which looks like this: parlelport.c: [code] #include #include #include #include ssize_t driver_read(struct file *filp, char *buf, size_t count, loff_t *f_pos); ssize_t driver_write(struct file *filp, char *buf, size_t count, loff_t *f_pos); int driver_open(struct inode *inode, struct file *filp); int driver_release(struct inode *inode, struct file *filp); int major = 61; int port; struct file_operations f_ops = { read: driver_read, write: driver_write, open: driver_open, release: driver_release }; void driver_exit(void){ unregister_chrdev(major, "parlelport"); if(!port){ release_region(0x378, 1); } printk(": Removing...\n"); } int driver_init(void){ int result; result = register_chrdev(major, "parlelport", &f_ops); if(result < 0){ printk(": Unable to register module!\n"); return result; } port = check_region(0x378, 1); if(port){ printk(": Requested region already reserved!\n"); result = port; goto fail; } request_region(0x378, 1, "parlelport"); printk(": Inserting...\n"); return 0; fail: driver_exit(); return result; } ssize_t driver_read(struct file *filp, char *buf, size_t count, loff_t *f_pos){ char buffer; int status; buffer = inb(0x378); status = copy_to_user(buf, &buffer, 1); switch(status){ case 0: printk("%i\n", buffer); break; } if(*f_pos == 0){ *f_pos += 1; return 0; }else{ return 0; } } ssize_t driver_write(struct file *filp, char *buf, size_t count, loff_t *f_pos){ char *tmp; char buffer; int status; tmp = buf + count - 1; status = copy_from_user(&buffer, tmp, 1); outb(buffer, 0x378); if(status == 0){ printk("%i\n", buffer); } return 1; } int driver_open(struct inode *inode, struct file *filp){ return 0; } int driver_release(struct inode *inode, struct file *filp){ return 0; } MODULE_LICENSE("GPL"); MODULE_AUTHOR("Benjamin D####"); module_init(driver_init); module_exit(driver_exit); [/code] I DO get a "/home/benjamin/Documents/c/kernel/parlelport/parlelport.c:16: warning: initialization from incompatible pointer type" waning when compiling from my Makefile though.. I don't know to fix it.. [quote]Line 16: write: driver_write,[/quote] Apparently it does register, reserve, and initialize correctly but something with the data in/outputs just doesn't seem right... As you can see my read and write functions log the data they in/output, and when doing an 'echo -n A >/dev/parlelport' followed by a 'cat /dev/parlelport', this shows up in my system log, NO MATTER WHAT DATA I WRITE TO THE DEVICE: [quote] [ 1962.448227] : Inserting... [ 1985.132240] 65 [ 1994.501861] -1 [/quote] Only '65' might change depending on what char I sent too the parlelport device, but I always receive -1 from the parallel port.....
    Link to this post 11 Oct 10

    Hello everyone!
    I've been doing some kernel module development for Linux lately, and I figured: Why not make a 6V LED light up?
    So I hooked up to wires with the LED and plugged the wires into hole/pin 2 and 25 (data0 and GND respectively) of my parallel port. Now all I needed was the device driver.. now the device driver is done..... it's not working.
    I have tested my homegrown "LED hardware" standalone with a 1.5V battery, which did make the LED glow slightly, so the 5V of the parallel port should definitely make it glow!
    I have made a virtual device using 'mknod' to communicate with the parallel port at 0x378 (confirmed, by the way).
    This is my mknod command: "sudo mknod /dev/parlelport c 61 0", and finally, to make the "device" accessible to anyone: "sudo chmod 666 /dev/parlelport".
    I can not insert the module with parport_pc running, so I remove that and the modules using it, before I 'insmod' my kernel module, which looks like this:
    parlelport.c:


    #include <linux/module.h>
    #include <linux/fs.h>
    #include <asm/uaccess.h>
    #include <asm/io.h>

    ssize_t driver_read(struct file *filp, char *buf, size_t count, loff_t *f_pos);
    ssize_t driver_write(struct file *filp, char *buf, size_t count, loff_t *f_pos);
    int driver_open(struct inode *inode, struct file *filp);
    int driver_release(struct inode *inode, struct file *filp);

    int major = 61;
    int port;

    struct file_operations f_ops = {
    read: driver_read,
    write: driver_write,
    open: driver_open,
    release: driver_release
    };

    void driver_exit(void){
    unregister_chrdev(major, "parlelport");

    if(!port){
    release_region(0x378, 1);
    }

    printk("<parallel_port_module>: Removing...\n");
    }

    int driver_init(void){
    int result;
    result = register_chrdev(major, "parlelport", &f_ops);

    if(result < 0){
    printk("<parallel_port_module>: Unable to register module!\n");
    return result;
    }

    port = check_region(0x378, 1);

    if(port){
    printk("<parallel_port_module>: Requested region already reserved!\n");
    result = port;
    goto fail;
    }

    request_region(0x378, 1, "parlelport");
    printk("<parallel_port_module>: Inserting...\n");
    return 0;

    fail:
    driver_exit();
    return result;
    }

    ssize_t driver_read(struct file *filp, char *buf, size_t count, loff_t *f_pos){
    char buffer;
    int status;
    buffer = inb(0x378);
    status = copy_to_user(buf, &buffer, 1);

    switch(status){
    case 0:
    printk("%i\n", buffer);
    break;
    }

    if(*f_pos == 0){
    *f_pos += 1;
    return 0;
    }else{
    return 0;
    }
    }

    ssize_t driver_write(struct file *filp, char *buf, size_t count, loff_t *f_pos){
    char *tmp;
    char buffer;
    int status;
    tmp = buf + count - 1;

    status = copy_from_user(&buffer, tmp, 1);
    outb(buffer, 0x378);

    if(status == 0){
    printk("%i\n", buffer);
    }

    return 1;
    }

    int driver_open(struct inode *inode, struct file *filp){
    return 0;
    }

    int driver_release(struct inode *inode, struct file *filp){
    return 0;
    }

    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("Benjamin D####");
    module_init(driver_init);
    module_exit(driver_exit);

    I DO get a "/home/benjamin/Documents/c/kernel/parlelport/parlelport.c:16: warning: initialization from incompatible pointer type" waning when compiling from my Makefile though.. I don't know to fix it..
    Line 16: write: driver_write,

    Apparently it does register, reserve, and initialize correctly but something with the data in/outputs just doesn't seem right...
    As you can see my read and write functions log the data they in/output, and when doing an 'echo -n A >/dev/parlelport' followed by a 'cat /dev/parlelport', this shows up in my system log, NO MATTER WHAT DATA I WRITE TO THE DEVICE:

    [ 1962.448227] <parallel_port_module>: Inserting...
    [ 1985.132240] 65
    [ 1994.501861] -1

    Only '65' might change depending on what char I sent too the parlelport device, but I always receive -1 from the parallel port.....

  • BenjaminD
    RE: How to monitor the USB ports of an old IBM T41?
    Nevermind. I got it working. I just did a few code modifications and moved around a few things. This is the new (and working) code: [code] import dbus import gobject from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() def device_added(udi): print "added" def device_removed(udi): print "removed" bus.add_signal_receiver(device_added, "DeviceAdded", "org.freedesktop.Hal.Manager", "org.freedesktop.Hal", "/org/freedesktop/Hal/Manager") bus.add_signal_receiver(device_removed, "DeviceRemoved", "org.freedesktop.Hal.Manager", "org.freedesktop.Hal", "/org/freedesktop/Hal/Manager") loop = gobject.MainLoop() loop.run() [/code]
    Link to this post 18 Sep 10

    Nevermind. I got it working. I just did a few code modifications and moved around a few things.
    This is the new (and working) code:


    import dbus
    import gobject
    from dbus.mainloop.glib import DBusGMainLoop

    DBusGMainLoop(set_as_default=True)
    bus = dbus.SystemBus()

    def device_added(udi):
    print "added"

    def device_removed(udi):
    print "removed"

    bus.add_signal_receiver(device_added, "DeviceAdded", "org.freedesktop.Hal.Manager", "org.freedesktop.Hal",
    "/org/freedesktop/Hal/Manager")
    bus.add_signal_receiver(device_removed, "DeviceRemoved", "org.freedesktop.Hal.Manager", "org.freedesktop.Hal",
    "/org/freedesktop/Hal/Manager")

    loop = gobject.MainLoop()
    loop.run()

  • BenjaminD
    RE: How to create a kb driver for my C Kernel?
    In my opinion, yes. - There is a lot of things that should be initiated/done, before developing the keyboard driver, - or at least if you want to do it properly. You need to provide good and secure functions to transfer data from kernel space to user space, interrupt handling, and some nice functions to do I/O processing :). Good luck, Benjamin.
    Link to this post 18 Sep 10

    In my opinion, yes. - There is a lot of things that should be initiated/done, before developing the keyboard driver, - or at least if you want to do it properly. You need to provide good and secure functions to transfer data from kernel space to user space, interrupt handling, and some nice functions to do I/O processing :).

    Good luck,
    Benjamin.

  • BenjaminD
    RE: How to monitor the USB ports of an old IBM T41?
    Hello! I'm sorry for the long wait, but I just haven't had a chance to do any programming lately, but now I'm back at it again. I really appreciate your link to DBus, and I've chosen to go the Python way (at least for a first try, as the DBus API for Python seems to be the most well documented, and the best for beginners). Right now my only problem is that my program seem to exit immediately after I execute it. This is what I did: First I just did a "sudo apt-get install ..." on the following packages: *python-dbus *python-wxgtk2.8 *python-wxglade *d-feet And they all seem to "install" correctly. The sourcecode is as follows: [code] import dbus from dbus.mainloop.glib import DBusGMainLoop dbus_loop = DBusGMainLoop() bus = dbus.SystemBus(mainloop=dbus_loop) def device_added_callback(udi): print "added" def device_removed_callback(udi): print "removed" bus.add_signal_receiver(device_added_callback, "DeviceAdded", "org.freedesktop.Hal.Manager", "org.freedesktop.Hal", "/org/freedesktop/Hal/Manager") bus.add_signal_receiver(device_removed_callback, "DeviceRemoved", "org.freedesktop.Hal.Manager", "org.freedesktop.Hal", "/org/freedesktop/Hal/Manager") [/code] When I save it and go: "python main.py" in the Terminal, the program terminate like 1 second after I press enter. It's probably something with the code, or so I hope, so it's a little easier to get out of :). Best regards, Benjamin.
    Link to this post 18 Sep 10

    Hello!
    I'm sorry for the long wait, but I just haven't had a chance to do any programming lately, but now I'm back at it again.
    I really appreciate your link to DBus, and I've chosen to go the Python way (at least for a first try, as the DBus API for Python seems to be the most well documented, and the best for beginners).
    Right now my only problem is that my program seem to exit immediately after I execute it.
    This is what I did:
    First I just did a "sudo apt-get install ..." on the following packages:
    *python-dbus
    *python-wxgtk2.8
    *python-wxglade
    *d-feet
    And they all seem to "install" correctly.
    The sourcecode is as follows:


    import dbus
    from dbus.mainloop.glib import DBusGMainLoop

    dbus_loop = DBusGMainLoop()
    bus = dbus.SystemBus(mainloop=dbus_loop)

    def device_added_callback(udi):
    print "added"

    def device_removed_callback(udi):
    print "removed"

    bus.add_signal_receiver(device_added_callback,
    "DeviceAdded",
    "org.freedesktop.Hal.Manager",
    "org.freedesktop.Hal",
    "/org/freedesktop/Hal/Manager")
    bus.add_signal_receiver(device_removed_callback,
    "DeviceRemoved",
    "org.freedesktop.Hal.Manager",
    "org.freedesktop.Hal",
    "/org/freedesktop/Hal/Manager")

    When I save it and go: "python main.py" in the Terminal, the program terminate like 1 second after I press enter.
    It's probably something with the code, or so I hope, so it's a little easier to get out of :).

    Best regards,
    Benjamin.

  • BenjaminD
    RE: Developing kernel: Hex for text color?
    Here you go, my friend: BLACK = 00h BLUE = 01h GREEN = 02h CYAN = 03h RED = 04h MAGENTA = 05h BROWN = 06h GRAY = 07h DARK GRAY = 08h BRIGHT BLUE = 09h BRIGHT GREEN = 0Ah BRIGHT CYAN = 0Bh PINK = 0Ch BRIGHT MAGENTA = 0Dh YELLOW = 0Eh WHITE = 0Fh
    Link to this post 14 Sep 10

    Here you go, my friend:
    BLACK = 00h
    BLUE = 01h
    GREEN = 02h
    CYAN = 03h
    RED = 04h
    MAGENTA = 05h
    BROWN = 06h
    GRAY = 07h
    DARK GRAY = 08h
    BRIGHT BLUE = 09h
    BRIGHT GREEN = 0Ah
    BRIGHT CYAN = 0Bh
    PINK = 0Ch
    BRIGHT MAGENTA = 0Dh
    YELLOW = 0Eh
    WHITE = 0Fh

  • BenjaminD
    How to monitor the USB ports of an old IBM T41?
    Hello everyone! Besides my Macbook I got this old IBM T41 with Ubuntu 10.04 installed on it. Currently, I'm working on developing a device driver for Ubuntu that'll monitor the USB ports of the computer, and report when a device has either been inserted or removed from either of the ports. I have entirely read this tutorial: http://www.freesoftwaremagazine.com/articles/drivers_linux?page=0%2C0, but that's about as much experience I got with device drivers. - I'm not completely new to working in this ring level though, as I have already developed my own little GUI toy OS. Best regards, Benjamin :cheer: .
    Link to this post 14 Sep 10

    Hello everyone!
    Besides my Macbook I got this old IBM T41 with Ubuntu 10.04 installed on it.
    Currently, I'm working on developing a device driver for Ubuntu that'll monitor the USB ports of the computer, and report when a device has either been inserted or removed from either of the ports.
    I have entirely read this tutorial: http://www.freesoftwaremagazine.com/articles/drivers_linux?page=0%2C0, but that's about as much experience I got with device drivers. - I'm not completely new to working in this ring level though, as I have already developed my own little GUI toy OS.

    Best regards,
    Benjamin :cheer: .

Who we are ?

The Linux Foundation is a non-profit consortium dedicated to the growth of Linux.

More About the foundation...

Frequent Questions

Join / Linux Training / Board