日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]前面,我們基本已經(jīng)學(xué)會怎么去編寫一個簡單的字符設(shè)備驅(qū)動程序了,這節(jié),我們來看看友善之臂中提供的led驅(qū)動。 參考之前寫的文章,我們已經(jīng)知道LED的GPIO口,和一些配置信息: http://blog.csdn.NET/morixinguan/article/details/50619675 在友善之臂提供的內(nèi)

前面,我們基本已經(jīng)學(xué)會怎么去編寫一個簡單的字符設(shè)備驅(qū)動程序了,這節(jié),我們來看看友善之臂中提供的led驅(qū)動。

參考之前寫的文章,我們已經(jīng)知道LED的GPIO口,和一些配置信息:

http://blog.csdn.NET/morixinguan/article/details/50619675

在友善之臂提供的內(nèi)核中,已經(jīng)有一個文件對這些GPIO做了對應(yīng)的封裝,

在drivers/gpio/gpio_dvs/exynos4x12_gpio_dvs.c中:

我們打開這個文件,找到LED對應(yīng)的四個IO口的宏如下:

EXYNOS4212_GPM4(0),
EXYNOS4212_GPM4(1),
EXYNOS4212_GPM4(2),
EXYNOS4212_GPM4(3),

操作GPIO,我們需要這三個.h的頭文件,

#include <Linux/gpio.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>

這幾個頭文件有通用的,也有與平臺相關(guān)的。

需要以下幾個函數(shù):

gpio_request

gpio_set_value

s3c_gpio_cfgpin

gpio_set_value

gpio_free

接下來看源碼的注釋分析:

#include <linux/kernel.h>

#include <linux/module.h>

#include <linux/miscdevice.h>

#include <linux/fs.h>

#include <linux/types.h>

#include <linux/moduleparam.h>

#include <linux/slab.h>

#include <linux/ioctl.h>

#include <linux/cdev.h>

#include <linux/delay.h>

 

#include <linux/gpio.h>

#include <mach/gpio.h>

#include <plat/gpio-cfg.h>



#define DEVICE_NAME "leds"


//找到LED管腳對應(yīng)的宏

static int led_gpios[] = {

EXYNOS4212_GPM4(0),

EXYNOS4212_GPM4(1),

EXYNOS4212_GPM4(2),

EXYNOS4212_GPM4(3),

};


#define LED_NUM ARRAY_SIZE(led_gpios)


//操作LED燈

//傳入1,亮燈

//傳入0,滅燈

static long tiny4412_leds_ioctl(struct file *filp, unsigned int cmd,

unsigned long arg)

{

switch(cmd) {

case 0:

case 1:

if (arg > LED_NUM) {

return -EINVAL;

}

//LED是低電平點亮的,傳入1亮,傳入0滅,是因為cmd做了取反的操作

//gpio_set_value這個函數(shù)是對IO賦值

gpio_set_value(led_gpios[arg], !cmd);

//printk(DEVICE_NAME": %d %d\n", arg, cmd);

break;


default:

return -EINVAL;

}


return 0;

}

//led操作文件結(jié)構(gòu)體

static struct file_operations tiny4412_led_dev_fops = {

.owner = THIS_MODULE,

.unlocked_ioctl = tiny4412_leds_ioctl,

};

//雜類設(shè)備結(jié)構(gòu)體

static struct miscdevice tiny4412_led_dev = {

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &tiny4412_led_dev_fops,

};

//led驅(qū)動加載

static int __init tiny4412_led_dev_init(void) {

int ret;

int i;


for (i = 0; i < LED_NUM; i++) {

//對GPIO注冊與申請內(nèi)存,并給設(shè)備驅(qū)動取名為LED

ret = gpio_request(led_gpios[i], "LED");

if (ret) {

printk("%s: request GPIO %d for LED failed, ret = %d\n", DEVICE_NAME,

led_gpios[i], ret);

return ret;

}

//調(diào)用該函數(shù),將所有的IO設(shè)置為輸出狀態(tài)

s3c_gpio_cfgpin(led_gpios[i], S3C_GPIO_OUTPUT);

//默認(rèn)情況下所有的IO初始化都亮

gpio_set_value(led_gpios[i], 1);

}

//雜類設(shè)備注冊

ret = misc_register(&tiny4412_led_dev);


printk(DEVICE_NAME"\tinitialized\n");


return ret;

}


static void __exit tiny4412_led_dev_exit(void) {

int i;


for (i = 0; i < LED_NUM; i++) {

//釋放申請的IO和內(nèi)存

gpio_free(led_gpios[i]);

}

//注銷雜類設(shè)備驅(qū)動

misc_deregister(&tiny4412_led_dev);

}


module_init(tiny4412_led_dev_init);

module_exit(tiny4412_led_dev_exit);


MODULE_LICENSE("GPL");

MODULE_AUTHOR("FriendlyARM Inc.");

有了這個框架,我們就可以拿來修改了,我們還可以往tiny4412_led_dev_fops中繼續(xù)添加read,write,close,lseek函數(shù),來實現(xiàn)LED的其它操作,有興趣的同學(xué)可以試一試,這些驅(qū)動在以前我已經(jīng)測試過了,這里僅僅只是對這些知識點進(jìn)行再次總結(jié)。

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉