第12章 Linux设备驱动的软件架构思想之平台总线、平台设备和平台驱动Demo

一、平台总线、平台设备和平台驱动简单实例

1、驱动头文件

#ifndef __VICHIP_H
#define __VICHIP_H

#define DRIVER_AUTHOR "[email protected]"
#define DRIVER_DESC   "A sample driver" 

#endif /* __VICHIP_H */

2、平台设备源文件

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/platform_device.h>

#include "vichip.h"

#define DEV_NAME "vi_fp1023"

struct platform_device *plat_dev = NULL;

static int __init vi_platform_dev_init(void)
{
int ret;

plat_dev = platform_device_alloc(DEV_NAME, -1);

ret = platform_device_add(plat_dev);
if (ret) {
printk(KERN_ERR "register platform device fail, ret = [%d]\n", ret);
return -1;
}

    printk(KERN_INFO "vi platform devcie init ok! ret = [%d]\n", ret);


    return 0; 
}


static void __exit vi_platform_dev_exit(void)
{
platform_device_unregister(plat_dev);
    printk(KERN_INFO "vi platform devcie exit\n");
}


module_init(vi_platform_dev_init);
module_exit(vi_platform_dev_exit);


MODULE_LICENSE("GPL");
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);

3、平台驱动源文件

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/platform_device.h>

#include "vichip.h"

static int vi_fp_probe(struct platform_device *pdev)  
{  
    printk(KERN_INFO "%s driver found device !!\n", __func__);  
    return 0;  
}  
  
static int vi_fp_remove(struct platform_device *pdev)  //
{  
    printk(KERN_INFO "%s driver found device unpluged !!\n", __func__);  
    return 0;  
}  

static struct platform_driver plat_driver={  
    .probe = vi_fp_probe,  
    .remove = vi_fp_remove,  
    .driver = {                    
        .owner = THIS_MODULE,  
        .name = "vi_fp1023", // 平台驱动的名称
    },  
};  


static int __init vi_platform_driv_init(void)
{
int ret;

ret = platform_driver_register(&plat_driver);
if (ret) {
printk(KERN_ERR "register platform driver fail, ret = [%d]\n", ret);
return -1;
}

    printk(KERN_INFO "vi platform driver init ok!\n");

    return 0; 
}


static void __exit vi_platform_driv_exit(void)
{
platform_driver_unregister(&plat_driver);  
    printk(KERN_INFO "vi platform driver exit\n");
}

module_init(vi_platform_driv_init);
module_exit(vi_platform_driv_exit);


MODULE_LICENSE("GPL");
MODULE_AUTHOR(DRIVER_AUTHOR);

MODULE_DESCRIPTION(DRIVER_DESC);

4、Makefile

CONFIG_MODULE_SIG=n
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:                               
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:                                             
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
else
    obj-m := vi_plat_dev.o vi_plat_driv.o

endif

二、验证结果

1、先安装平台设备模块,再安装平台驱动模块

2、先安装平台驱动模块,再安装平台设备模块

3、通过dmesg查看输出的内核信息

猜你喜欢

转载自blog.csdn.net/xiezhi123456/article/details/80462126