2014-01-22 55 views
0

我在Linux驱动开发是一个新手。我读过一些关于这方面的书籍。初学者设备驱动程序开发的Linux

我开始像其他人(我认为)与“Hello World”的例子,但我想多。我发现这个代码在一本书:

#include <linux/module.h> 
#include <linux/configfs.h> 
#include <linux/init.h> 
#include <linux/tty.h> 
#include <linux/kd.h> 
#include <linux/vt.h> 
#include <linux/console_struct.h> 
#include <linux/vt_kern.h> 

MODULE_DESCRIPTION("Example module illustrating the use of Keyboard LEDs."); 
MODULE_LICENSE("GPL"); 

struct timer_list my_timer; 
struct tty_driver *my_driver; 
char kbledstatus = 0; 
#define BLINK_DELAY HZ/5 
#define ALL_LEDS_ON 0x07 
#define RESTORE_LEDS 0xFF 

    static void my_timer_func(unsigned long ptr) 
    { 
    int *pstatus = (int *)ptr; 
    if (*pstatus == ALL_LEDS_ON) 
      *pstatus = RESTORE_LEDS; 
    else 
      *pstatus = ALL_LEDS_ON; 
    (my_driver->ops->ioctl) (vc_cons[fg_console].d->port.tty, KDSETLED, 
         *pstatus); 
    my_timer.expires = jiffies + BLINK_DELAY; 
    add_timer(&my_timer); 
    } 

    static int __init kbleds_init(void) 
    { 
    int i; 
    printk(KERN_INFO "kbleds: loading\n"); 
    printk(KERN_INFO "kbleds: fgconsole is %x\n", fg_console); 
    for (i = 0; i < MAX_NR_CONSOLES; i++) { 
      if (!vc_cons[i].d) 
        break; 
      printk(KERN_INFO "poet_atkm: console[%i/%i] #%i, tty %lx\n", i, 
        MAX_NR_CONSOLES, vc_cons[i].d->vc_num, 
        (unsigned long)vc_cons[i].d->port.tty); 
    } 
    printk(KERN_INFO "kbleds: finished scanning consoles\n"); 
    my_driver = vc_cons[fg_console].d->port.tty->driver; 
    printk(KERN_INFO "kbleds: tty driver magic %x\n", my_driver->magic); 

    init_timer(&my_timer); 
    my_timer.function = my_timer_func; 
    my_timer.data = (unsigned long)&kbledstatus; 
    my_timer.expires = jiffies + BLINK_DELAY; 
    add_timer(&my_timer); 
    return 0; 
    } 

    static void __exit kbleds_cleanup(void) 
    { 
    printk(KERN_INFO "kbleds: unloading...\n"); 
    del_timer(&my_timer); 
    (my_driver->ops->ioctl) (vc_cons[fg_console].d->port.tty, KDSETLED, 
         RESTORE_LEDS); 
    } 
    module_init(kbleds_init); 
    module_exit(kbleds_cleanup); 

我试图理解的代码,主要是我已经做了,但也有部分我不明白

例如:

(my_driver->ops->ioctl) (vc_cons[fg_console].d->port.tty, KDSETLED, 
         *pstatus); 

和功能static int __init kbleds_init(void)

如果有人能帮助我解决这个问题!如果你想能够解释或者给我一个链接到一本书来理解这段代码

回答

0

我不是司机或者专家,但是从我对C的经验,我可以尝试解释足以让你走得更远。

你问的第一行是接受了三个参数vc_cons[fg_console].d->port.ttyKDSETLED定义的类型功能的驱动程序的定义,*pstatus

(my_driver->ops->ioctl)是嵌套在结构内的结构ops中存在的一个功能my_driver

合并的线
(my_driver->ops->ioctl) (vc_cons[fg_console].d->port.tty, KDSETLED,*pstatus); 正在使用上述参数调用该函数。

了解static int __init kbleds_init(void)函数作为一个整体所做的工作需要查看包含的各种头文件,以找出所用数据类型的定义和结构(以便了解.dvc_cons[fg_console]是)。该指针有具有财产tty这相当于,你会真正地送出“打开LED”命令电传一个端口字段。 KDSETLED是与“LED ON”对应的代码,最后一个参数是命令状态指针。

许多这些参考#define宏和定义由内核为你开LED与驱动程序在键盘上,在这个例子中所要求的格式结构。

希望这有助于一些。祝你好运。