本文共 5131 字,大约阅读时间需要 17 分钟。
下面将之前的按键驱动改写为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:
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。
执行应用程序,效果和之前的一模一样。
转载地址:http://elsci.baihongyu.com/