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

RK3288開發板PopMetal上的GPIO驅動實例

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

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

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

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
  • Dev Tool Bits——使用DVRT協議查看項目中的數據
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品九九99久久在观看 | 麻豆精品国产 | 99香蕉国产线观看免费 | 日本免费人成黄页网观看视频 | 亚洲高清视频网站 | 五月天精品视频播放在线观看 | 日韩专区在线观看 | haodiaokan| 污污视频网站免费在线观看 | 美女紧身裤裆看光了下面 | 成人午夜在线视频 | 2021国产麻豆剧集 | 亚洲欧美另类在线视频 | 4hu影院最新地址www | chainaxxxtube8| 午夜在线观看cao | 一级一片一a一片 | av毛片在线看 | 四虎影院在线播放 | 国产va在线视频观看 | 欧美大片大片播放网站 | 玖玖爱视频在线 | 香蕉视频破解版 | 麻豆成人久久精品二区三区小说 | 国产欧美在线播放 | 91精品欧美一区二区三区 | 国产67194| 亚洲青草视频 | 视频一区二区在线播放 | 99精彩视频| 天天夜夜狠狠 | 欧美成人亚洲国产精品 | 黄色片子免费看 | 日韩精品视频观看 | 亚洲高清一区二区三区久久 | www.4h| 亚洲国产成人久久精品图片 | freee性欧美 freeexoxoxo性欧美 | 欧美在线观看视频 | 久草视频资源在线观看 | 青青草原免费在线 |