歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

在platform總線上注冊設備並載入驅動控制led燈

開發板:龍芯1B

PC:Ubuntu 13.10

本程序自己定義一個設備注冊到內核,然後再編寫該設備驅動。最終實現開發板led燈控制,開發板led燈通過gpio口控制

/*************************************************************************
 > File Name: platform_test.c
 > Author: kid
 > Mail: [email protected]
 > Created Time: 2014年03月05日 星期三 11時17分02秒
 ************************************************************************/

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/device.h>

#define SET_GPIO (*(volatile unsigned *)0xbfd010C4)
#define SET_OUT (*(volatile unsigned *)0xbfd010D4)
#define SET_LED (*(volatile unsigned *)0xbfd010F4)

static int led_probe(struct platform_device *pdev)  //驅動加載時運行此函數,設置gpio控制led燈
{
    SET_GPIO = (SET_GPIO | 0x000000C0);
    SET_OUT = (SET_OUT & ~(0x000000C0));
    SET_LED = (SET_LED & ~(0x000000c0));
    printk(KERN_ALERT "hello\n");
 
    return 0;
}

static struct platform_device led_device = {  //添加設備結構體
    .name = "led",
    .id = 99,
};

static struct platform_driver led_driver = {  //添加驅動結構體
 .driver = {
  .name = "led",
  .owner = THIS_MODULE,
 },
 .probe  = led_probe,
};

static int __devinit led_init(void)  //初始化驅動
{
    int ret = 0;
    platform_device_register(&led_device);  //注冊設備到內核
    ret = platform_driver_register(&led_driver);  //注冊驅動到內核
    if (ret){
        printk(KERN_ERR "failed to register\n");
    }
       
    return ret;
}

static void __devexit led_exit(void)  //驅動退出
{
    platform_driver_unregister(&led_driver);  //卸載驅動
    platform_device_unregister(&led_device);  //卸載設備
    printk(KERN_ALERT "good bye\n");
}

module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");

注意:必須要注冊設備和驅動,調試過程中曾沒有注冊設備導致驅動初始化的時候不會執行probe函數,注冊設備和驅動的順序可以隨意。但兩者必須的設備名稱必須匹配。

 

Copyright © Linux教程網 All Rights Reserved