In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-01-18 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Internet Technology >
Share
Shulou(Shulou.com)06/02 Report--
Today, I will talk to you about the example analysis of test buttons in Linux driver development, which may not be well understood by many people. In order to make you understand better, the editor has summarized the following contents for you. I hope you can get something according to this article.
Example 1:
1. Driver code
# include # define DEVICE_NAME "buttons" struct button_irq_desc {int irq; int pin; int pin_setting; int number; char * name;} Static struct button_irq_desc button_irqs [] = {{IRQ_EINT8, S3C2410_GPG (0), S3C2410_GPG0_EINT8, 0, "KEY0"}, {IRQ_EINT11, S3C2410_GPG (3), S3C2410_GPG3_EINT11, 1, "KEY1"}, {IRQ_EINT13, S3C2410_GPG (5), S3C2410_GPG5_EINT13, 2, "KEY2"}, {IRQ_EINT14, S3C2410_GPG (6), S3C2410_GPG6_EINT14, 3 "KEY3", {IRQ_EINT15, S3C2410_GPG (7), S3C2410_GPG7_EINT15, 4, "KEY4"}, {IRQ_EINT19, S3C2410_GPG (11), S3C2410_GPG11_EINT19, 5, "KEY5"},} Static volatile char key_values [] = {'0th, 0th, 0th, 0th, 0th, 0th, 0th, 0th,' 0th, '0th,' 0th,'0}; static DECLARE_WAIT_QUEUE_HEAD (button_waitq); static volatile int ev_press = 0position static irqreturn_t buttons_interrupt (int irq, void * dev_id) {struct button_irq_desc * button_irqs = (struct button_irq_desc *) dev_id; int down; / / udelay (0) Down =! s3c2410_gpio_getpin (button_irqs- > pin); if (down! = (key_ values [button _ irqs- > number] & 1) {/ / Changed key_ values [button _ irqs- > number] ='0' + down; ev_press = 1; wake_up_interruptible (& button_waitq);} return IRQ_RETVAL (IRQ_HANDLED) } static int s3c24xx_buttons_open (struct inode * inode, struct file * file) {int i; int err = 0; for (I = 0; I
< sizeof(button_irqs)/sizeof(button_irqs[0]); i++) { if (button_irqs[i].irq < 0) { continue; } err = request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH, button_irqs[i].name, (void *)&button_irqs[i]); if (err) break; } if (err) { i--; for (; i >= 0; iMurt -) {if (button_ irqs [I] .irq
< 0) { continue; } disable_irq(button_irqs[i].irq); free_irq(button_irqs[i].irq, (void *)&button_irqs[i]); } return -EBUSY; } ev_press = 1; return 0;}static int s3c24xx_buttons_close(struct inode *inode, struct file *file){ int i; for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) { if (button_irqs[i].irq < 0) { continue; } free_irq(button_irqs[i].irq, (void *)&button_irqs[i]); } return 0;}static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp){ unsigned long err; if (!ev_press) { if (filp->F_flags & O_NONBLOCK) return-EAGAIN; else wait_event_interruptible (button_waitq, ev_press);} ev_press = 0; err = copy_to_user (buff, (const void *) key_values, min (sizeof (key_values), count)); return err?-EFAULT: min (sizeof (key_values), count) } static unsigned int s3c24xx_buttons_poll (struct file * file, struct poll_table_struct * wait) {unsigned int mask = 0; poll_wait (file, & button_waitq, wait); if (ev_press) mask | = POLLIN | POLLRDNORM; return mask } static struct file_operations dev_fops = {.owner = THIS_MODULE, .open = s3c24xx_buttons_open, .release = s3c24xx_buttons_close, .read = s3c24xx_buttons_read, .poll = s3c24xx_buttons_poll,}; static struct miscdevice misc = {.minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = & dev_fops,} Static int _ init dev_init (void) {int ret; ret = misc_register (& misc); printk (DEVICE_NAME "\ tinitialized\ n"); return ret;} static void _ exit dev_exit (void) {misc_deregister (& misc);} module_init (dev_init); module_exit (dev_exit); MODULE_LICENSE ("GPL"); MODULE_AUTHOR ("FriendlyARM Inc.")
2. Test the code
# include # include int main (void) {int buttons_fd; char buttons [6] = {'0,0,0,0,0,0,0,0,0,0}; buttons_fd = open ("/ dev/buttons", 0); if (buttons_fd)
< 0) { perror("open device buttons"); exit(1); } for (;;) { char current_buttons[6]; int count_of_changed_key; int i; if (read(buttons_fd, current_buttons, sizeof current_buttons) != sizeof current_buttons) { perror("read buttons:"); exit(1); } for (i = 0, count_of_changed_key = 0; i < sizeof buttons / sizeof buttons[0]; i++) { if (buttons[i] != current_buttons[i]) { buttons[i] = current_buttons[i]; printf("%skey %d is %s", count_of_changed_key? ", ": "", i+1, buttons[i] == '0' ? "up" : "down"); count_of_changed_key++; } } if (count_of_changed_key) { printf("\n"); } } close(buttons_fd); return 0;} 示例二: 1、驱动程序 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME "buttons2"struct button_irq_desc { int irq; int pin; int number; char *name;};static struct button_irq_desc button_irqs [] = { {IRQ_EINT8 , S3C2410_GPG(0) , 0, "KEY0"}, {IRQ_EINT11, S3C2410_GPG(3) , 1, "KEY1"}, {IRQ_EINT13, S3C2410_GPG(5) , 2, "KEY2"}, {IRQ_EINT14, S3C2410_GPG(6) , 3, "KEY3"}, {IRQ_EINT15, S3C2410_GPG(7) , 4, "KEY4"}, {IRQ_EINT19, S3C2410_GPG(11), 5, "KEY5"},};static volatile int key_values [] = {0, 0, 0, 0, 0, 0, 0};static DECLARE_WAIT_QUEUE_HEAD(button_waitq);static volatile int ev_press = 0;static irqreturn_t buttons_interrupt(int irq, void *dev_id){ struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id; int down; // udelay(0); down = !s3c2410_gpio_getpin(button_irqs->Pin); if (down) {/ / Changed key_ values [button _ irqs- > number + 1] = key_ values [button _ irqs- > number + 1] + 1; key_values [0] = key_values [0] + 1; ev_press = 1; wake_up_interruptible (& button_waitq);} return IRQ_RETVAL (IRQ_HANDLED) } static int s3c24xx_buttons_open (struct inode * inode, struct file * file) {int i; int err = 0; for (I = 0; I
< sizeof(button_irqs)/sizeof(button_irqs[0]); i++) { if (button_irqs[i].irq < 0) { continue; } err = request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH, button_irqs[i].name, (void *)&button_irqs[i]); if (err) break; } if (err) { i--; for (; i >= 0; iMurt -) {if (button_ irqs [I] .irq
< 0) { continue; } disable_irq(button_irqs[i].irq); free_irq(button_irqs[i].irq, (void *)&button_irqs[i]); } return -EBUSY; } ev_press = 1; return 0;}static int s3c24xx_buttons_close(struct inode *inode, struct file *file){ int i; for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) { if (button_irqs[i].irq < 0) { continue; } free_irq(button_irqs[i].irq, (void *)&button_irqs[i]); } return 0;}static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp){ unsigned long err; if (!ev_press) { if (filp->F_flags & O_NONBLOCK) return-EAGAIN; else wait_event_interruptible (button_waitq, ev_press);} ev_press = 0; err = copy_to_user (buff, (const void *) key_values, min (sizeof (key_values), count)); return err?-EFAULT: min (sizeof (key_values), count) } static unsigned int s3c24xx_buttons_poll (struct file * file, struct poll_table_struct * wait) {unsigned int mask = 0; poll_wait (file, & button_waitq, wait); if (ev_press) mask | = POLLIN | POLLRDNORM; return mask } static struct file_operations dev_fops = {.owner = THIS_MODULE, .open = s3c24xx_buttons_open, .release = s3c24xx_buttons_close, .read = s3c24xx_buttons_read, .poll = s3c24xx_buttons_poll,}; static struct miscdevice misc = {.minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = & dev_fops,} Static int _ init dev_init (void) {int ret; ret = misc_register (& misc); printk (DEVICE_NAME "\ tinitialized\ n"); return ret;} static void _ exit dev_exit (void) {misc_deregister (& misc);} module_init (dev_init); module_exit (dev_exit); MODULE_LICENSE ("GPL"); MODULE_AUTHOR ("FriendlyARM Inc.")
2. Test program
# include # include int main (void) {int buttons_fd; int total_buttons_click = 0; buttons_fd = open ("/ dev/buttons2", 0); if (buttons_fd < 0) {perror ("open device buttons"); exit (1) } while (1) {int current_buttons [7]; int count_of_changed_key; int i; if (read (buttons_fd, current_buttons, sizeof current_buttons)! = sizeof current_buttons) {perror ("read buttons:"); exit (1) } if (total_buttons_click < current_buttons [0]) {total_buttons_click = current_buttons [0] Printf ("total:% d\ t key1:% d\ t key2:% d\ t key3:% d\ t key4:% d\ t key5:% d\ t key6:% d\ n", current_buttons [0], current_buttons [1], current_buttons [2], current_buttons [3] Current_buttons [4], current_buttons [5], current_buttons [6]) }} close (buttons_fd); return 0;} after reading the above, do you have any further understanding of the sample analysis of test buttons in Linux driver development? If you want to know more knowledge or related content, please follow the industry information channel, thank you for your support.
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.