hello_world-2.2之简单设备驱动模型(一)

                   hello_world-2.2之简单设备驱动模型(一)

写一个最简单的driver,bus,device 来演示驱动模型

1.helloworld-bus.c

#include<linux/module.h>
#include<linux/init.h>
#include<linux/string.h>
#include<linux/device.h>
#include<linux/kernel.h>

static int virtual_bus_match(struct device *dev,struct device_driver *drv)
{
   return !strncmp(dev_name(dev),drv->name,strlen(drv->name));

}

struct bus_type virtual_bus = {
   .name = "my_bus",
   .match = virtual_bus_match,
};

EXPORT_SYMBOL(virtual_bus);
static int __init bus_init(void)
{
   int ret;
   ret = bus_register(&virtual_bus);
   if(ret)
      return ret;
   printk("bus register sucess\n");
   return ret;
}

static void __exit bus_exit(void)
{
   bus_unregister(&virtual_bus);
}
module_init(bus_init);
module_exit(bus_exit);
MODULE_LICENSE("GPL");









2.helloworld_device.c


#include<linux/module.h>
#include<linux/init.h>
#include<linux/string.h>
#include<linux/device.h>

extern struct bus_type virtual_bus;
extern struct device my_bus;
void virtual_device_release(struct device *dev)
{
   printk("virtual_device is release\n");

}

struct device virtual_device ={
   .init_name = "my_dev",
   .bus = &virtual_bus,
   .release = virtual_device_release,
};


static int __init device_init(void)
{
   int ret;
   ret = device_register(&virtual_device);
   if(ret)
      return ret;
   
   printk("device register sucess\n");
   return ret;

}

static void __exit device_exit(void)
{
   device_unregister(&virtual_device);
}
module_init(device_init);
module_exit(device_exit);
MODULE_AUTHOR("doublenian.xie@gmail.com");
MODULE_LICENSE("GPL");

3.helloworld_driver.c

#include<linux/module.h>
#include<linux/init.h>
#include<linux/string.h>
#include<linux/device.h>
#include<linux/kernel.h>

extern struct bus_type virtual_bus;
int my_driver_remove(struct device *dev)
{
   printk(KERN_NOTICE "driver is remove\n");
   return 0;
}

int my_driver_probe(struct device *dev)
{
   printk(KERN_NOTICE "driver can handle the device\n");
   return 0;

}


struct device_driver virtual_driver = {
   .name = "my_dev",
   .bus = &virtual_bus,
   .probe = my_driver_probe,
   .remove = my_driver_remove,
};


static int __init my_driver_init(void)
{
   int ret;
   ret = driver_register(&virtual_driver);

   if(ret)
      return ret;
   printk("driver register sucess\n");
   return ret;

}

static void __exit my_driver_exit(void)
{
   driver_unregister(&virtual_driver);

}

module_init(my_driver_init);
module_exit(my_driver_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("doublenian.xie");

4.Makefile

obj-m += helloworld-device.o helloworld-bus.o helloworld-driver.o
all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

哦,对了在加载模块时应该先加载helloworld-bus.ko哦!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值