驱动程序分层分离概念

发布时间:2025-01-27 01:03

理解层次划分:识别概念的层次关系,构建知识框架。 #生活技巧# #学习技巧# #深度理解技巧#

分层概念:

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

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

分离概念:

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

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

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

led_drv.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

/* 分配/设置/注册一个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

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

/* 分配/设置/注册一个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

#include

#include

#include

/* 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 n", argv[0]);

        return 0;

    }

    if (strcmp(argv[1], "on") == 0)

    {

        val  = 1;

    }

    else

    {

        val = 0;

    }

    write(fd, &val, 4);

    return 0;

}

关键字:驱动程序  分层分离引用地址:驱动程序分层分离概念_总线驱动设备模型_P声明:本文内容及配图由平台用户或入驻媒体撰写。文章观点仅代表作者本人,不代表EEWorld网站立场。文章及其配图仅供工程师学习之用,如有内容侵权或违规,请联系本站处理,邮箱地址:bbs_service@eeworld.com.cn

网址:驱动程序分层分离概念 https://www.yuejiaxmz.com/news/view/742039

相关内容

事件驱动编程、消息驱动编程、数据驱动编程
【概念篇】你真正了解越来越火的“数据驱动” 吗?
vb应用程序管理分为哪几层
家庭生活的数字化:一个多层次的概念分析框架
5分钟搞清楚物联网的概念
化妆的概念与分类
机器人流程自动化的概念
深度解码:Android源码与驱动编程实战揭秘
21款环保概念车抢先看
高效驱动LED离线式照明

随便看看