http://blog.csdn.net/sjwangjinbao/archive/2010/12/26/6099210.aspx
下面将之前的按键驱动改写为platform设备。
1、建立文件夹Key+Platform
2、在文件夹Key+Platform下建立设备文件keydevice.c。
#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/platform_device.h>
MODULE_AUTHOR("WJB");
MODULE_LICENSE("Dual BSD/GPL");
static struct platform_device *my_device;
static int __init my_device_init(void)
{
}
static void my_device_exit(void)
{
}
module_init(my_device_init);
module_exit(my_device_exit);
3、在文件夹Key+Platform下建立驱动文件keydriver.c。
#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/platform_device.h>
#include <linux/fs.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
MODULE_AUTHOR("WJB");
MODULE_LICENSE("Dual BSD/GPL");
#define DEVICE_NAME "pf_key_dev"
struct button_irq_desc{
};
static struct button_irq_desc button_irqs[] = {
};
static volatile char key_values[] = {'0', '0', '0', '0', '0', '0'};
static DECLARE_WAIT_QUEUE_HEAD(button_waitq);
static volatile int ev_press = 0;
static irqreturn_t buttons_interrupt(int irq, void* dev_id)
{
}
static int s3c24xx_buttons_open(struct inode* inode, struct file* file)
{
}
static int s3c24xx_buttons_close(struct inode* inode, struct file* file)
{
}
static int s3c24xx_buttons_read(struct file* filp, char __user *buff, size_t count, loff_t *offset)
{
}
static unsigned int s3c24xx_buttons_poll(struct file* file, struct poll_table_struct *wait)
{
}
static struct file_operations dev_fops = {
};
static struct miscdevice misc = {
};
static int my_probe(struct device* dev)
{
}
static int my_remove(struct device* dev)
{
}
static struct platform_driver my_driver = {
};
static int __init my_driver_init(void)
{
}
static void my_driver_exit(void)
{
}
module_init(my_driver_init);
module_exit(my_driver_exit);
4、Makefile
ifneq ($(KERNELRELEASE), )
obj-m := keydriver.o keydevice.o
else
KDIR := /usr/src/linux-2.6.32.2
all:
clean:
endif
5、执行make。
得到keydevice.ko和keydriver.ko。
6、编写应用程序。
其实此时的应用程序和之前的应用程序是一样的,只是修改下设备名字就好了。
7、将生成的应用程序以及keydevice.ko和keydriver.ko拷贝到开发板上的某个目录下。
执行insmod keydevice.ko和insmod keydriver.ko以后,我们发现/dev下已经多了个设备pf_key_dev。同时,在/sys/bus/platform/devices也发现了我们的设备pf_key_dev,在/sys/bus/platform/drivers也发现了我们的设备驱动pf_key_dev。
执行应用程序,效果和之前的一模一样。