驱动程序分层分离概念_总线驱动设备模型_P

发布时间:2023-09-25  

分层概念:

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

比如:输入子程序一个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;

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    STM32外设寄存器简介及简单用法;STM32外设有哪些? 外设指的是单片机外部的外围功能模块,比如键盘控制芯片,液晶,A/D转换芯片,等等。外设可通过单片机的I/O,SPI,I2C等总线控制......
    液压控制系统主要应用在哪些设备;  液压控制系统主要应用在哪些设备   液压控制系统可以应用于各种工业设备和机械装置,常见的应用包括:   机床和金属加工设备:液压控制系统广泛应用于各种机床和金属加工设备......
    ;③控制总线控制总线用于传递控制信号,如启动读/写操作或中断处理。它确保了数据总线和地址总线的有效运作;④扩展总线扩展总线通常用于连接附加设备,如打印机、扫描仪等。这些设备......
    电机执行器、电磁阀执行器、舵机执行器等。这些执行器的供电电压范围通常在3V到5V或12V到24V之间,需要通过电源管理系统提供。 ·通讯芯片:汽车控制器中的通讯芯片包括CAN总线控制器、LIN总线控制器等。这些......
    器中的通讯芯片包括CAN总线控制器、LIN总线控制器等。这些通讯芯片的供电电压通常在3.3V到5V之间,需要通过电源管理系统提供。 ·存储器:汽车控制器中的存储器包括闪存、RAM等。这些......
    的工作距离,并通过减少电容来提高性能。随着电容下降,信号时间常数 t 将由上拉电阻决定。  图 1  双向总线隔离  图2  双向总线中继器 对于那些设计双向总线控制器的人,可以使用总线......
    要清楚你要做一个什么样的产品,这个产品包含哪些功能,要采集哪些信号?要控制哪些设备?要走哪些通讯协议?通讯协议走什么接口?是不是要显示界面?是不是要声光提示?是不是要低功耗?清楚了这些需求以后就可以选型了。 比如......
    基于S3C2440的linux-3.6.6移植——LED驱动;目前的linux版本的许多驱动都是基于设备模型,LED也不例外。   简单地说,设备模型就是系统认为所有的设备都是挂接在总线上的,而要使设备......
    插槽中安装了PC-CAN总线适配卡,这样就可以通过CAN总线将上、下位机联系在一起构成控制网络。下位机控制器采用单片机AT89C51和CAN总线控制器SJA1000共同组成的智能节点,它们直接对各现场设备(如......
    现更丰富的算力配置。 值得一提的是,这里的UP HPVC与UP Hub均具备可插拔能力,以满足不同车型智能化水平的需求。 UP VMC:打造数字化的运动系统 作为UP超级底盘控制的核心,UP VMC......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>