linux platform driver 机制实现leds设备的内核注册与led灯的点亮

平台: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,在卸载驱动时也要相应的卸载设备和驱动。


      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值