zoukankan      html  css  js  c++  java
  • 驱动程序分层分离概念_总线驱动设备模型_P

    分层概念:

    驱动程序向上注册的原理:

    比如:输入子程序一个input.c作为一层,下层为Dev.c和Dir.c,分别编写Dev.c和Dir.c向上Input.c注册;如图所示

    分离概念:

    分离概念主要是讲,设备驱动程序分成两个部分,也将引进另一个新概念bus_dri_dev模型

    总线-驱动-设备模式,是讲吧一个驱动分成两个部分,分别挂载到一条总线上的链表中,总线上有.match函数还对两个链表相同名字相匹配,匹配成功跳到driver驱动程序的probe函数来实现驱动的操作。

    一下例子主要编写总线驱动设备模式来实现一个控制LED灯的驱动实验:

    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>
    
    
    /* 分配/设置/注册一个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)
    {
        platform_device_unregister(&led_dev);
    }
    
    module_init(led_dev_init);
    module_exit(led_dev_exit);
    
    MODULE_LICENSE("GPL");

    led_dev.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>
    
    
    /* 分配/设置/注册一个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)
    {
        platform_device_unregister(&led_dev);
    }
    
    module_init(led_dev_init);
    module_exit(led_dev_exit);
    
    MODULE_LICENSE("GPL");

    Makefile:

    KERN_DIR = /work/system/linux-2.6.22.6
    
    all:
        make -C $(KERN_DIR) M=`pwd` modules 
    
    clean:
        make -C $(KERN_DIR) M=`pwd` modules clean
        rm -rf modules.order
    
    obj-m    += led_drv.o
    obj-m    += led_dev.o

    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!
    ");
        }
        if (argc != 2)
        {
            printf("Usage :
    ");
            printf("%s <on|off>
    ", argv[0]);
            return 0;
        }
    
        if (strcmp(argv[1], "on") == 0)
        {
            val  = 1;
        }
        else
        {
            val = 0;
        }
        
        write(fd, &val, 4);
        return 0;
    }
  • 相关阅读:
    十分钟抢票千余张,黄牛的抢票软件是何原理
    常见乱码解决
    如何给程序中的变量起个好名字
    jsp自定义标签
    request.getHeader("Referer")理解【转载】
    mybatis学习笔记1--HelloMybatis
    Spring学习笔记14---bean的使用
    Spring学习笔记13--Autowire(自动装配)
    Spring 学习笔记12--AOP讲解
    Spring学习笔记11--Spring 自动装配 Bean
  • 原文地址:https://www.cnblogs.com/yihujiu/p/6395214.html
Copyright © 2011-2022 走看看