linuxÔÓÏîÉ豸Çý¶¯Ä£ÐÍÄ£°å

LinuxÇý¶¯ÖаÑÎÞ·¨¹éÀàµÄÎ廨°ËÃŵÄÉ豸¶¨ÒåΪ»ìÔÓÉ豸(ÓÃmiscdevice½á¹¹Ìå±íÊö)¡£miscdevice¹²ÏíÒ»¸öÖ÷É豸ºÅMISC_MAJOR(¼´10)£¬µ«´ÎÉ豸ºÅ²»Í¬¡£ ËùÓеÄmiscdeviceÉ豸ÐγÉÁËÒ»¸öÁ´±í£¬¶ÔÉ豸·ÃÎÊʱÄں˸ù¾Ý´ÎÉ豸ºÅ²éÕÒ¶ÔÓ¦µÄmiscdeviceÉ豸£¬È»ºóµ÷ÓÃÆäfile_operations½á¹¹ÖÐ×¢²áµÄÎļþ²Ù×÷½Ó¿Ú½øÐвÙ×÷¡£ ÔÚÄÚºËÖÐÓÃstruct miscdevice±íʾmiscdeviceÉ豸£¬È»ºóµ÷ÓÃÆäfile_operations½á¹¹ÖÐ×¢²áµÄÎļþ²Ù×÷½Ó¿Ú½øÐвÙ×÷¡£miscdeviceµÄAPIʵÏÖÔÚdrivers/char/misc.cÖС£

»ìÔÓÏîÉ豸Çý¶¯µÄ³ÌÐò×éÖ¯¼Ü¹¹£º

н¨Ò»¸öfirst_led.c,ÏÈ¿ÉÄÜÓõ½µÄÍ·Îļþ¶¼ÒýÓÃÉÏ°É£¡

#include

#include //Çý¶¯Ä£¿é±ØÐèÒª¼ÓµÄ¸öÍ·Îļþ #include #include #include

#include #include #include #include #include .

//¶ÔÓ¦×ÅÏàÓ¦»úÆ÷ƽ̨µÄÍ·Îļþ #include

#include #include

//¸ø×Ô¼ºÉ豸Çý¶¯¶¨ÒåÒ»¸öÃû×Ö

#define DEVICE_NAME \

Ãû×ÖÓÐÁË£¬µ«Ñù×ÓÊÇÔõÑùµÄÄØ£¿ÏÖÔھͿªÊ¼¶¨ÒåÒ»¸ö¡°Ñù×Ó¡±£¡

Èç¹ûÒ»¸ö×Ö·ûÉ豸Çý¶¯ÒªÇý¶¯¶à¸öÉ豸£¬ÄÇôËü¾Í²»Ó¦¸ÃÓÃmiscÉ豸À´ÊµÏÖ¡£

ͨ³£Çé¿öÏ£¬Ò»¸ö×Ö·ûÉ豸¶¼²»µÃ²»ÔÚ³õʼ»¯µÄ¹ý³ÌÖнøÐÐÏÂÃæµÄ²½Ö裺

ͨ¹ýalloc_chrdev_region()·ÖÅäÖ÷´ÎÉ豸ºÅ¡£

ʹÓÃcdev_init()ºÍcdev_add()À´ÒÔÒ»¸ö×Ö·ûÉ豸ע²á×Ô¼º¡£

¶øÒ»¸ömiscÇý¶¯£¬Ôò¿ÉÒÔÖ»ÓÃÒ»¸öµ÷ÓÃmisc_register()

À´Íê³ÉÕâËùÓеIJ½Öè¡£(ËùÒÔmiscdeviceÊÇÒ»ÖÖÌØÊâµÄchrdev×Ö·ûÉ豸Çý¶¯) ËùÓеÄmiscdeviceÉ豸ÐγÉÒ»¸öÁ´±í£¬¶ÔÉ豸·ÃÎÊʱ£¬Äں˸ù¾Ý´ÎÉ豸ºÅ²éÕÒ ¶ÔÓ¦µÄmiscdeviceÉ豸£¬È»ºóµ÷ÓÃÆäfile_operationsÖÐ×¢²áµÄÎļþ²Ù×÷·½·¨½øÐвÙ×÷¡£

ÔÚLinuxÄÚºËÖУ¬Ê¹ÓÃstruct miscdeviceÀ´±íʾmiscdevice¡£Õâ¸ö½á¹¹ÌåµÄ¶¨ÒåΪ£º

struct miscdevice {

int minor;

const char *name;

const struct file_operations *fops; struct list_head list; struct device *parent; struct device *this_device; const char *nodename; mode_t mode; };

minorÊÇÕâ¸ö»ìÔÓÉ豸µÄ´ÎÉ豸ºÅ£¬ÈôÓÉϵͳ×Ô¶¯ÅäÖã¬Ôò¿ÉÒÔÉèÖÃΪ MISC_DYNANIC_MINOR£¬nameÊÇÉ豸Ãû

ΪÁËÈÝÒ×Àí½â£¬ÎÒÃÇÏÈ´ò´ó¸ÅµÄ¡°Ñù×Ó¡±×öºÃ¡£Ö»×öminor¡¢name¡¢fops£» ¶¨ÒåÒ»¸ömyfirst_led_devÉ豸£º

static struct miscdevice myfirst_led_dev = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &myfirst_led_dev_fops, };

Minor name ¶¼ÒѾ­¶¨ÒåºÃÁË¡£ÄÇô½ÓÏÂÀ´ÊµÏÖÒ»ÏÂmyfirst_led_dev_fops·½·¨¡£

ÄÚºËÖйØÓÚfile_operationsµÄ½á¹¹ÌåÈçÏ£º struct file_operations { struct module *owner;

loff_t (*llseek) (struct file *, loff_t, int);

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

int (*readdir) (struct file *, void *, filldir_t);

unsigned int (*poll) (struct file *, struct poll_table_struct *); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *, fl_owner_t id); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, int datasync);

int (*aio_fsync) (struct kiocb *, int datasync); int (*fasync) (int, struct file *, int);

int (*lock) (struct file *, int, struct file_lock *);

ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);

unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); int (*check_flags)(int);

int (*flock) (struct file *, int, struct file_lock *);

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ì滻Ϊ@) ËÕICP±¸20003344ºÅ-4