一、平台总线、平台设备和平台驱动简单实例
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查看输出的内核信息