平台:ubantu 12.04LTS
开发板:loongson zigbee
参考代码:1 /1b-linux-3.0-20130104/arch/mips/loongson/ls1x/ls1b-board/platform.c
2 /1b-linux-3.0-20130104/ sound/oss/ls1b-ac97.c 音频设备驱动文件
3 /1b-linux-3.0-20130104/include/linux/platform_device.h
linux platform driver 的简介:
Linux platform driver机制和传统的device_driver机制相比,一个十分明显的优势在于platform机制将本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform_device提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性。platform_device最大的特定是CPU直接寻址设备的寄存器空间,即使对于其他总线设备,设备本身的寄存器无法通过CPU总线访问,但总线的controller仍然需要通过platform bus来管理。
在Linux 2.6的设备驱动模型中,关心总线、设备和驱动这3个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。 一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2 C、SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC系统中集成的独立的外设控制器、挂接在SoC内存空间的外设等确不依附于此类总 线。基于这一背景,Linux发明了一种虚拟的总线,称为platform总线,相应的设备称为platform_device,而驱动成为 platform_driver。
代码清单:
#include <asm/io.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/slab.h>
#include<linux/platform_device.h>
#define DEVICE_NAME "leds"
#define GPIOCFG1 (*(volatile unsigned long*) 0xbfd010C4)
#define GPIOOE1 (*(volatile unsigned long*)0xbfd010D4)
#define GPIOOUT1 (*(volatile unsigned long*)0xbfd010F4)
static int led_spi_probe(struct platform_device *pdev)
{
printk(KERN_WARNING "open led linght\n");
GPIOCFG1 |= 0x000000C0;
GPIOOE1 &= ~(0x000000C0);
GPIOOUT1 &= ~(0x000000C0);
return 0;
}
static struct platform_driver led_spi_driver = {
.driver = {
.name = "leds",
.owner = THIS_MODULE,
},
.probe = led_spi_probe,
};
static struct platform_device led_spi_device = {
.name = "leds",
.id = 111,
};
static int __devinit led_spi_init(void)
{ printk("heee");
platform_device_register(&led_spi_device);
platform_driver_register(&led_spi_driver);
// int ret = 0;
//ret = platform_driver_register(&led_spi_driver);
// if (ret)
// printk(KERN_ERR "failed to register led-spi-driver");
return 0;
}
static void __devexit led_spi_exit(void)
{
platform_driver_unregister(&led_spi_driver);
platform_device_unregister(&led_spi_device);
}
module_init(led_spi_init);
module_exit(led_spi_exit);
MODULE_LICENSE("GPL");
分析:
首先,在入口函数(初始化)中注册设备(led)和与之相对应的设备驱动(driver),将其加到总线上,并且定义相应platform device和platform driver,在卸载驱动时也要相应的卸载设备和驱动。