Linux Driver之总线设备驱动bus-dev-drv模型
2013-11-13 22:38
375 查看
以下是led_platform_dev文件内容:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
static struct resource res[] =
{
[0] =
{
.start = 5,
.end = 8,
.name = "nled",
.flags = IORESOURCE_IRQ,
},
};
static void led_release(struct device *dev)
{
return;
}
static struct platform_device led_dev =
{
.name = "myled",
.id = 0,
.num_resources = ARRAY_SIZE(res),
.resource = res,
.dev =
{
.release = led_release,
},
};
static int __init led_dev_init(void)
{
return platform_device_register(&led_dev);
}
static void __exit led_dev_exit(void)
{
return platform_device_unregister(&led_dev);
}
module_init(led_dev_init);
module_exit(led_dev_exit);
MODULE_LICENSE("GPL");
以下是led_platform_drv文件内容:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/fs.h>
#include <asm/gpio.h>
#include <plat/gpio-cfg.h>
#include <linux/uaccess.h>
#include <mach/regs-gpio.h>
static unsigned int major;
static struct class * led_cls;
static struct device * led_dev;
static unsigned int pin_start;
static unsigned int pin_end;
static int led_open(struct inode *inode, struct file * file)
{
int i;
for(i = pin_start;i <= pin_end;++i)
{
s3c_gpio_cfgpin(S3C2410_GPB(i), S3C2410_GPIO_OUTPUT);//配置GPIO引脚为输出功能
}
return 0;
}
static ssize_t led_write(struct file *file, const char __user *buf, size_t size, loff_t *off)
{
int i;
unsigned char nled = -1;
if(size != 1)
return -EINVAL;
copy_from_user(&nled, buf, size);
printk("nled = %d\n", nled);
if(nled == 0)
{
for(i = pin_start;i <= pin_end;++i)
{
gpio_set_value(S3C2410_GPB(i), 1); /* 关闭led灯 */
}
}
else
{
gpio_set_value(S3C2410_GPB(nled + 4), 0); /* 开启led灯 */
}
return 0;
}
static struct file_operations f_ops =
{
.owner = THIS_MODULE,
.open = led_open,
.write = led_write,
};
static int led_probe(struct platform_device *pdev)
{
struct resource *res;
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if(res == NULL)
return -EINVAL;
major = register_chrdev(0, "led", &f_ops);
led_cls = class_create(THIS_MODULE, "led");
led_dev = device_create(led_cls, NULL, MKDEV(major, 0), NULL, "myled");
pin_start = res->start; /* TQ2440 GPB5~8 -- LED1~4 */
pin_end = res->end; /* pin_start=5 pin_end=8 */
return 0;
}
static int led_remove(struct platform_device *pdev)
{
device_destroy(led_cls, MKDEV(major, 0));
class_destroy(led_cls);
unregister_chrdev(major, "led");
return 0;
}
static struct platform_driver led_drv =
{
.probe = led_probe,
.remove = led_remove,
.driver = {
.name = "myled",
.owner = THIS_MODULE,
},
};
static int __init led_drv_init(void)
{
return platform_driver_register(&led_drv);
}
static void __exit led_drv_exit(void)
{
return platform_driver_unregister(&led_drv);
}
module_init(led_drv_init);
module_exit(led_drv_exit);
MODULE_LICENSE("GPL");
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
static struct resource res[] =
{
[0] =
{
.start = 5,
.end = 8,
.name = "nled",
.flags = IORESOURCE_IRQ,
},
};
static void led_release(struct device *dev)
{
return;
}
static struct platform_device led_dev =
{
.name = "myled",
.id = 0,
.num_resources = ARRAY_SIZE(res),
.resource = res,
.dev =
{
.release = led_release,
},
};
static int __init led_dev_init(void)
{
return platform_device_register(&led_dev);
}
static void __exit led_dev_exit(void)
{
return platform_device_unregister(&led_dev);
}
module_init(led_dev_init);
module_exit(led_dev_exit);
MODULE_LICENSE("GPL");
以下是led_platform_drv文件内容:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/fs.h>
#include <asm/gpio.h>
#include <plat/gpio-cfg.h>
#include <linux/uaccess.h>
#include <mach/regs-gpio.h>
static unsigned int major;
static struct class * led_cls;
static struct device * led_dev;
static unsigned int pin_start;
static unsigned int pin_end;
static int led_open(struct inode *inode, struct file * file)
{
int i;
for(i = pin_start;i <= pin_end;++i)
{
s3c_gpio_cfgpin(S3C2410_GPB(i), S3C2410_GPIO_OUTPUT);//配置GPIO引脚为输出功能
}
return 0;
}
static ssize_t led_write(struct file *file, const char __user *buf, size_t size, loff_t *off)
{
int i;
unsigned char nled = -1;
if(size != 1)
return -EINVAL;
copy_from_user(&nled, buf, size);
printk("nled = %d\n", nled);
if(nled == 0)
{
for(i = pin_start;i <= pin_end;++i)
{
gpio_set_value(S3C2410_GPB(i), 1); /* 关闭led灯 */
}
}
else
{
gpio_set_value(S3C2410_GPB(nled + 4), 0); /* 开启led灯 */
}
return 0;
}
static struct file_operations f_ops =
{
.owner = THIS_MODULE,
.open = led_open,
.write = led_write,
};
static int led_probe(struct platform_device *pdev)
{
struct resource *res;
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if(res == NULL)
return -EINVAL;
major = register_chrdev(0, "led", &f_ops);
led_cls = class_create(THIS_MODULE, "led");
led_dev = device_create(led_cls, NULL, MKDEV(major, 0), NULL, "myled");
pin_start = res->start; /* TQ2440 GPB5~8 -- LED1~4 */
pin_end = res->end; /* pin_start=5 pin_end=8 */
return 0;
}
static int led_remove(struct platform_device *pdev)
{
device_destroy(led_cls, MKDEV(major, 0));
class_destroy(led_cls);
unregister_chrdev(major, "led");
return 0;
}
static struct platform_driver led_drv =
{
.probe = led_probe,
.remove = led_remove,
.driver = {
.name = "myled",
.owner = THIS_MODULE,
},
};
static int __init led_drv_init(void)
{
return platform_driver_register(&led_drv);
}
static void __exit led_drv_exit(void)
{
return platform_driver_unregister(&led_drv);
}
module_init(led_drv_init);
module_exit(led_drv_exit);
MODULE_LICENSE("GPL");
相关文章推荐
- s3c2410下 platform 总线设备和驱动 led_drv.c led_dev.c 和test
- 嵌入式linux平台设备驱动(设备驱动模型)开发之linux内核中bus总线
- Linux设备模型中三个很重要的概念: 总线,设备,驱动.即bus,device,driver
- 设备驱动模型:总线bus_type 设备device 驱动driver
- 设备模型(device-model)之平台总线(bus),驱动(driver),设备(device)
- 总线(bus)、设备(device)、驱动(driver)三者构成了设备驱动的模型
- 总线设备驱动模型(bus/platform)
- 4412驱动-平台总线驱动 9th_led_bus_drv_dev
- 总线设备驱动模型:bus->match,driver->probe
- LINUX设备驱动之设备模型五--device&driver&bus(三)
- linux内核部件分析(八)——设备驱动模型之bus
- Linux总线设备驱动模型相关理论和实例
- Linux Kernel设备驱动模型之总线添加驱动
- 木其工作室(专业程序代写服务)[原]ok6410学习笔记(15.platform平台总线驱动模型之混杂设备驱动led)
- LINUX设备驱动之设备模型五--device&driver&bus(三)
- 总线驱动模型中注册 字符类设备
- linux下的总线设备驱动模型分析
- Linux驱动之设备模型(4)-总线
- 平台总线设备驱动模型——基础知识
- linux设备驱动模型——总线、设备、设备驱动