Module Wrapper
Prev | Chapter 2. Radio Devices | Next

## Module Wrapper

Finally we add in the usual module wrapping and the driver is done.

    #ifndef MODULE

    static int io = 0x300;

    #else

    static int io = -1;

    #endif

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("A driver for an imaginary radio card.");
    module_param(io, int, 0444);
    MODULE_PARM_DESC(io, "I/O address of the card.");

    static int __init init(void)
    {
            if(io==-1)
            {
                    printk(KERN_ERR
             "You must set an I/O address with io=0x???\n");
                    return -EINVAL;
            }
            return myradio_init(NULL);
    }

    static void __exit cleanup(void)
    {
            video_unregister_device(&my_radio);
            release_region(io, MY_IO_SIZE);
    }

    module_init(init);
    module_exit(cleanup);

In this example we set the IO base by default if the driver is compiled into the kernel: you can still set it using "my_radio.irq" if this file is called `my_radio.c`. For the module we require the user sets the parameter. We set io to a nonsense port (-1) so that we can tell if the user supplied an io parameter or not.

We use MODULE_ defines to give an author for the card driver and a description. We also use them to declare that io is an integer and it is the address of the card, and can be read by anyone from sysfs.

The clean-up routine unregisters the video_device we registered, and frees up the I/O space. Note that the unregister takes the actual video_device structure as its argument. Unlike the file operations structure which can be shared by all instances of a device a video_device structure as an actual instance of the device. If you are registering multiple radio devices you need to fill in one structure per device (most likely by setting up a template and copying it to each of the actual device structures).

Prev | Up | Next
The Ioctl Interface | Home | Chapter 3. Video Capture Devices