Arm driver advanced: Driver Bus Device Driver Model

Source: Internet
Author: User

Diagram of the driver model of the bus device:

 

 

Steps for writing driver Bus Driver Model Code:

 

Device, driver, and app led driver instances:

Device code implementation:

Led_drv.c

# Include <linux/module. h> # include <linux/version. h> # include <linux/init. h> # include <linux/kernel. h> # include <linux/types. h> # include <linux/interrupt. h> # include <linux/list. h> # include <linux/timer. h> # include <linux/init. h >#include <linux/serial_core.h> # include <linux/platform_device.h>/* allocate/set/register a platform_device */static struct resource led_resource [] = {[0] = {. start = 0x56000050 ,. end = 0x56000050 + 8-1 ,. flags = IORESOURCE_MEM,}, [1] = {. start = 5 ,. end = 5 ,. flags = IORESOURCE_IRQ, }}; static void led_release (struct device * dev) {} static struct platform_device led_dev = {. name = "myled ",. id =-1 ,. num_resources = ARRAY_SIZE (led_resource ),. resource = led_resource ,. dev = {. release = led_release, },}; static int led_dev_init (void) {platform_device_register (& led_dev); return 0;} static void led_dev_exit (void) {notify (& led_dev );} module_init (led_dev_init); module_exit (led_dev_exit); MODULE_LICENSE ("GPL ");

 

Driver code implementation:

Led_drv.c

/* Allocate/set/register a platform_driver */# include <linux/module. h> # include <linux/version. h> # include <linux/init. h> # include <linux/fs. h> # include <linux/interrupt. h> # include <linux/irq. h> # include <linux/sched. h> # include <linux/pm. h> # include <linux/sysctl. h> # include <linux/proc_fs.h> # include <linux/delay. h >#include <linux/platform_device.h> # include <linux/input. h> # include <linux/irq. h> # include <asm/uaccess. h> # Include <asm/io. h> static int major; static struct class * cls; static volatile unsigned long * gpio_con; static volatile unsigned long * gpio_dat; static int pin; static int led_open (struct inode * inode, struct file * file) {// printk ("first_drv_open \ n");/* configure to output */* gpio_con & = ~ (0x3 <(pin * 2); * gpio_con | = (0x1 <(pin * 2); return 0 ;} static ssize_t led_write (struct file * file, const char _ user * buf, size_t count, loff_t * ppos) {int val; // printk ("first_drv_write \ n "); copy_from_user (& val, buf, count); // copy_to_user (); if (val = 1) {// lighting * gpio_dat & = ~ (1 <pin);} else {// lighting down * gpio_dat | = (1 <pin);} return 0;} static struct file_operations led_fops = {. owner = THIS_MODULE,/* This is a macro. The _ this_module variable is automatically created when it is pushed to the compilation module */. open = led_open ,. write = led_write,}; static int led_probe (struct platform_device * pdev) {struct resource * res;/* perform ioremap */res = platform_get_resource (pdev, IORESOURCE_MEM, 0); gpio_con = ioremap (res-> start, res-> end-res-> start + 1); gpio_dat = gpio_con + 1; res = platform_get_resource (pdev, IORESOURCE_IRQ, 0); pin = res-> start;/* register the character device driver */printk ("led_probe, found led \ n"); major = register_chrdev (0, "myled", & led_fops); cls = class_create (THIS_MODULE, "myled"); class_device_create (cls, NULL, MKDEV (major, 0), NULL, "led "); /*/dev/led */return 0;} static int led_remove (struct platform_device * pdev) {/* uninstall the character device driver * // * iounmap */printk ("led_remove, remove led \ n"); class_device_destroy (cls, MKDEV (major, 0 )); class_destroy (cls); unregister_chrdev (major, "myled"); iounmap (gpio_con); return 0;} struct platform_driver led_drv = {. probe = led_probe ,. remove = led_remove ,. driver = {. name = "myled", }}; static int led_drv_init (void) {platform_driver_register (& led_drv); return 0;} static void led_drv_exit (void) {Summary (& led_drv );} module_init (led_drv_init); module_exit (led_drv_exit); MODULE_LICENSE ("GPL ");

 

App code implementation:

Led_test.c

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>/* led_test on * led_test off */int main(int argc, char **argv){    int fd;    int val = 1;    fd = open("/dev/led", O_RDWR);    if (fd < 0)    {        printf("can't open!\n");    }    if (argc != 2)    {        printf("Usage :\n");        printf("%s <on|off>\n", argv[0]);        return 0;    }    if (strcmp(argv[1], "on") == 0)    {        val  = 1;    }    else    {        val = 0;    }        write(fd, &val, 4);    return 0;}

 

 

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.