Chinaunix首页 | 论坛 | 博客
  • 博客访问: 698818
  • 博文数量: 193
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2187
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(193)

文章存档

2024年(9)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: LINUX

2011-06-18 10:05:50

一个简单的platform设备驱动
硬/软件环境:s3c2440/linux-2.6.36/busybox-1.18.4/arm-linux-gcc 4.4.3

下面是模块的c代码:

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

#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/platform_device.h>

#include <asm/io.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("zl");

int zl_probe(struct device * dev)
{
    struct platform_device *pdev = container_of(dev, struct platform_device, dev);
    struct resource *res = pdev->resource;

    printk("driver zl_probe.\n");

    return 0;
}

int zl_remove(struct device * dev)
{
    printk("driver zl_remove.\n");
    return 0;
}

struct device_driver zl_driver_struct = {
        .name = "zl_device", //this string will be show as /sys/bus/platform/drivers/zl_device

        .bus = &platform_bus_type,
        .probe = zl_probe,
        .remove = zl_remove,
};

void zl_release(struct device *dev)
{
    printk("device release.\n");
}

struct resource zl_res[] = {
    {
        .name = "zl_res_name",
        .start = 0x56000000,
        .end = 0x57000000,
        .flags = IORESOURCE_IO,
    },

    {
        .start = IRQ_EINT2,
        .end = IRQ_EINT2,
        .flags = IORESOURCE_IRQ,
    },
};

struct platform_device zl_dev = {
    .name = "zl_device",        //this string will be show as /sys/devices/platform/zl_device.0

    .dev = {
        .release = zl_release,
    },
    .num_resources = ARRAY_SIZE(zl_res),
    .resource = zl_res,
};

int test_init(void)
{
    int ret = 0;

    platform_device_register(&zl_dev);
    driver_register(&zl_driver_struct);
    return ret;
}

void test_exit(void)
{
    driver_unregister(&zl_driver_struct);
    platform_device_unregister(&zl_dev);
}

module_init(test_init);
module_exit(test_exit);


下面是Makefile文件内容:

#KERNEL    = /home/zl/my2440-2.6.13
KERNEL    = /media/STUDY/linux/kernel/my2440-2.6.36
#KERNEL    = /lib/modules/$(shell uname -r)/build

default:
    make -C $(KERNEL) M=$(shell pwd) modules

clean:
    make -C $(KERNEL) M=$(shell pwd) modules clean

modules_install:
    make -C $(KERNEL) M=$(shell pwd) modules_install INSTALL_MOD_PATH=/home/zl/s3c2440_nfs
    depmod -a -b /home/zl/s3c2440_nfs 2.6.36-MY2440

obj-m    += driver.o


执行make命令后,“insmod driver.ko”插入模块后

/sys/devices/platform/zl_device.0文件生成
    /sys/bus/platform/devices/目录下有名为zl_device.0的链接文件指向../../../devices/platform/zl_device.0
    /sys/bus/platform/drivers/zl_device/目录下有zl_device.0软链接指向../../../../devices/platform/zl_device.0
    如果platform_device结构体中name与device_driver结构中的name值相同就会执行probe指向的函数zl_probe函数


阅读(1338) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~