国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

RK3288開發(fā)板PopMetal上的GPIO驅(qū)動(dòng)實(shí)例

發(fā)布時(shí)間:2015-8-3 17:49    發(fā)布者:穿prada的008
關(guān)鍵詞: PopMetal , RK3288 , GPIO
樓主在這邊給大家介紹下如何使用PopMetal的GPIO。先講過程,再講原理吧,
該驅(qū)動(dòng)需要涉及到的知識(shí)點(diǎn):1,DTS設(shè)備樹的作用,2,platform虛擬總線驅(qū)動(dòng)的編寫。
第一步,添加DTS節(jié)點(diǎn)
在/kernel/arch/arm/boot/dts/rockchip.dts下添加如下內(nèi)容。
下圖rockchip-leds-gpio這部分的內(nèi)容,修改保存,

第二步,在kernel/drivers下創(chuàng)建個(gè)LED文件夾,然后加入如下幾個(gè)文件驅(qū)動(dòng)文件leds.c,Makefile和Kconfig.如下圖
源碼:
/***********************************************************************************
* driver for led0
*
**********************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static int leds_probe(struct platform_device *pdev)
{  int ret =-1
int i
int led
enum of_gpio_flags flag
struct device_node *led_node = pdev->dev.of_node
led = of_get_named_gpio_flags(led_node,"led-gpios",0,&flag)
printk("get gpio id successful\n")
if(!gpio_is_valid(led)){
  printk("invalid led-gpios: %d\n",led)
  return -1
}
if(gpio_request(led,"led_gpio")){
printk("led gpio request failed!\n")
return ret
}
  gpio_direction_output(led,1)
for(i=0 i < 10 i++)
{
  gpio_set_value(led,1)
  mdelay(500)
  gpio_set_value(led,0)
  mdelay(500)
  printk("it's %d\n",i)
}
return 0

}
static int leds_remove(struct platform_device *pdev)
{
        return 0
}

static struct of_device_id leds_of_match[] = {
        { .compatible = "rockchip-leds-gpio" },
        { }
}
MODULE_DEVICE_TABLE(of, leds_of_match)
static struct platform_driver leds_driver = {
        .driver         = {
                .name           = "leds-drivers",
                .owner          = THIS_MODULE,
                .of_match_table = of_match_ptr(leds_of_match),
        },
        .probe          = leds_probe,
        .remove         = leds_remove,
};

/*static int __init leds_init(void)
{
    printk(KERN_INFO "Enter %s\n", __FUNCTION__)
    return platform_driver_register(&leds_driver)
    return 0
}

static void __exit leds_exit(void)
{
platform_driver_unregister(&leds_driver)
    printk("close leds\n")
}*/module_platform_driver(leds_driver)
module_platform_driver(leds_driver)

MODULE_DESCRIPTION("leds Driver")
MODULE_LICENSE("GPL")
MODULE_ALIAS("platform:leds-drivers")
/***********************************************************************************
* driver for led0
*
**********************************************************************************/
Kconfig:
  
Makefile:
  
第三步,修改drivers下的Kconfig和Makefile,修改內(nèi)容如下
在Kconfig末尾添加:source “drivers/led/Kconfig”
在Makefile末尾添加: obj-$(CONFIG_LED0_TEST)  +=led/
第四步,編譯新的kernel與resource并燒寫進(jìn)板子里,
然后DTS中定義的引腳就會(huì)按照驅(qū)動(dòng)的內(nèi)容,進(jìn)行高低電平的變化。
需要源碼可下載: led.zip (1.52 KB)
好了,現(xiàn)在我們來介紹下原理,首先是DTS,和另一塊開發(fā)板PX2不一樣,PopMetal并沒有寫相應(yīng)的mach-*****文件,而是通過設(shè)備樹的方式獲取引腳的編號(hào),設(shè)備樹的引入可減少了內(nèi)核為支持新硬件而需要的改變,提高代碼重用,加速了Linux支持包的開發(fā),使得單個(gè)內(nèi)核鏡像能支持多個(gè)系統(tǒng)。簡(jiǎn)單來說,它就是給內(nèi)核的一個(gè)參數(shù),這些參數(shù)會(huì)啟動(dòng)相應(yīng)的驅(qū)動(dòng),這樣參數(shù)不一樣,內(nèi)核源碼支持的系統(tǒng)就不一樣。
而在這里我們要清楚的是我們要用相應(yīng)的引腳就必須創(chuàng)建相應(yīng)的節(jié)點(diǎn),并且賦上一些參數(shù)。
而驅(qū)動(dòng)又是怎么識(shí)別到這些參數(shù)的呢?這里我們先講講platform虛擬總線驅(qū)動(dòng),這個(gè)總線跟IIC,SPI等總線不一樣,是由內(nèi)核虛擬出來的,我們就以上面的代碼為例,給大家講講他是怎么工作的,
首先這個(gè)驅(qū)動(dòng)的核心是:
static struct platform_driver leds_driver = {
        .driver         = {
                .name           = "leds-drivers",//驅(qū)動(dòng)名
                .owner          = THIS_MODULE,
                .of_match_table = of_match_ptr(leds_of_match),//匹配設(shè)備樹
        },
        .probe          = leds_probe,//探測(cè)函數(shù),檢測(cè)硬件上是否存在設(shè)備,檢測(cè)到便執(zhí)行
        .remove         = leds_remove,//移除函數(shù),硬件移除時(shí),執(zhí)行
};
在這里我們只給部分內(nèi)容賦予了值,本身這個(gè)結(jié)構(gòu)體還有別的子項(xiàng),需要了解的同學(xué)可以在這編博客看看:http://blog.sina.com.cn/s/blog_53c733350100zdav.html
在這個(gè)結(jié)構(gòu)體中,我們就是通過.of_match_table = of_match_ptr(leds_of_match),來匹配設(shè)備樹上的參數(shù),而即系統(tǒng)會(huì)根據(jù)設(shè)備樹種定義的compatible參數(shù)比較驅(qū)動(dòng)中的leds_of_match中定義的 .compatible 參數(shù),
來為參數(shù)找到相應(yīng)的驅(qū)動(dòng),而定義的probe和remove函數(shù)則是對(duì)探測(cè)到設(shè)備做出反應(yīng),及移除設(shè)備時(shí)做出反應(yīng),而module_platform_driver(leds_driver)是將驅(qū)動(dòng)掛到總線上去,
現(xiàn)在我們看看probe是怎么獲取到GPIO的值的,其中它的主要函數(shù)如下:
struct device_node *led_node = pdev->dev.of_node
led = of_get_named_gpio_flags(led_node,"led-gpios",0,&flag)
功能就是將led_node節(jié)點(diǎn)上的led-gpios的值取下,而我們之前在rockchip.dts中隊(duì)led-gpios的定義如下:
led-gpios=&GPIO6 GPIO_A6 GPIO_ACTIVE_LOW,意思就是選擇引腳gpio6_a6,且該引腳低電平有效。
上面這句賦值便已經(jīng)將引腳的編號(hào)賦給了led-gpios,故接下來我們就可以用GPIO_requset_one GPIO_set_value,等函數(shù)去操作這個(gè)GPIO了,像gpio_set_value(led-gpios,1)將該引腳設(shè)置為高電平。
當(dāng)然這些操作只是相對(duì)于引腳沒復(fù)用的GPIO口,引腳如果有復(fù)用功能,我們還得進(jìn)行一些別的操作把引腳的功能選好。

本文地址:http://www.qingdxww.cn/thread-151948-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 想要避免發(fā)生災(zāi)難,就用MPLAB SiC電源仿真器!
  • Cortex-M4外設(shè) —— TC&TCC結(jié)合事件系統(tǒng)&DMA優(yōu)化任務(wù)培訓(xùn)教程
  • 你仿真過嗎?使用免費(fèi)的MPLAB Mindi模擬仿真器降低設(shè)計(jì)風(fēng)險(xiǎn)
  • 我們是Microchip
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费大片av手机看片 | 91精品视频免费在线观看 | 花季传媒3.0.3每天免费3次 | 国产成人性毛片aaww | 国产高清精品久久久久久久 | 天堂网在线视频 | 欧美一区二区三区日韩免费播 | 99热这里只有精品国产动漫 | 国产在线视频91 | 亚洲成年人网址 | 欧美高清在线精品一区 | 青青草原影视 | 1国产精品卡1卡2卡3 | 欧美色成人tv在线播放 | 欧美一区二区三区香蕉视 | 99热这里有免费国内精品 | 色涩播 | 伊伊人成亚洲综合人网香 | 男女网站免费 | 榴莲丝瓜黄瓜草莓向日葵污苹果 | 和日本免费不卡在线v | 久久久久久免费播放一级毛片 | 又粗又硬又爽的三级视频 | 国产精品1区 2区 3区 | 91视频免费网址 | 特级片免费看 | 四虎永久在线精品884aa下载 | 免费黄色在线视频 | 91麻豆精品国产91久久久久 | 日韩免费观看的一级毛片 | 久久久99视频| h黄动漫在线观看播放 | 一区二区三区四区欧美 | 成人欧美在线观看 | 成人欧美一区二区三区视频不卡 | 久久免费高清视频 | 久草网视频在线观看 | 麻豆久久婷婷综合五月国产 | 国产成人午夜极速观看 | 欧美精品影视 | 日日爱爱|