www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式案例Show
[導(dǎo)讀]為了更好的理解安卓的層次關(guān)系,本文在RK3399的安卓系統(tǒng)上增加LED燈的外設(shè),并使用APP打開(kāi)關(guān)閉LED燈。以這樣一個(gè)最簡(jiǎn)單的實(shí)例,來(lái)演示從上層到底層的調(diào)用過(guò)程。首先從最底層的kernel層開(kāi)始。 一、驅(qū)動(dòng)開(kāi)發(fā) Kernel層就是要將LED硬件接入到系統(tǒng),完成驅(qū)動(dòng)的開(kāi)發(fā)

為了更好的理解安卓的層次關(guān)系,本文在RK3399的安卓系統(tǒng)上增加LED燈的外設(shè),并使用APP打開(kāi)關(guān)閉LED燈。以這樣一個(gè)最簡(jiǎn)單的實(shí)例,來(lái)演示從上層到底層的調(diào)用過(guò)程。首先從最底層的kernel層開(kāi)始。


一、驅(qū)動(dòng)開(kāi)發(fā)

Kernel層就是要將LED硬件接入到系統(tǒng),完成驅(qū)動(dòng)的開(kāi)發(fā)。Linux下的驅(qū)動(dòng)是使用C語(yǔ)言進(jìn)行開(kāi)發(fā)的,可分為三類設(shè)備類型:字符設(shè)備,塊設(shè)備,網(wǎng)絡(luò)設(shè)備。每種類型的驅(qū)動(dòng)都有他自有的驅(qū)動(dòng)框架,學(xué)習(xí)驅(qū)動(dòng)開(kāi)發(fā)就是要熟悉各種驅(qū)動(dòng)架構(gòu),并根據(jù)實(shí)際需求在框架內(nèi)添加內(nèi)容。LED的驅(qū)動(dòng)我們選擇最簡(jiǎn)單的雜項(xiàng)字符類設(shè)備驅(qū)動(dòng)即可。

從原理圖中可以得到兩個(gè)GPIO:GPIO1_C7和GPIO1_D0,驅(qū)動(dòng)三極管來(lái)使得LED燈亮滅。

圖:led燈原理圖


1)設(shè)備樹(shù)文件(kernel/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-common.dtsi)

test-leds{compatible = "test,leds";led1-work = <&gpio1 23 GPIO_ACTIVE_LOW>;led2-work = <&gpio1 24 GPIO_ACTIVE_LOW>;status = "okay";};

2)  驅(qū)動(dòng)文件(kernel/drivers/gpio/gpio-testled.c)

#include <linux/errno.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/slab.h>#include <linux/input.h>#include <linux/init.h>#include <linux/serio.h>#include <linux/delay.h>#include <linux/clk.h>#include <linux/gpio.h>#include <linux/platform_device.h>#include <linux/miscdevice.h>#include <linux/of.h>#include <linux/of_device.h>#include <linux/of_address.h>#include <linux/of_platform.h>#include <linux/of_gpio.h>#include <asm/io.h>#include <asm/uaccess.h>#include <linux/cdev.h>
MODULE_AUTHOR("embeddedtech");MODULE_LICENSE("Dual BSD/GPL");
#define LEDCTRL_MAGIC 'k'#define LED1CTRL_ON_CMD _IO (LEDCTRL_MAGIC, 1)#define LED1CTRL_OFF_CMD _IO (LEDCTRL_MAGIC, 2)#define LED2CTRL_ON_CMD _IO (LEDCTRL_MAGIC, 3)#define LED2CTRL_OFF_CMD _IO (LEDCTRL_MAGIC, 4)
struct led_data {int led1_pin; //led1引腳int led2_pin; //led2引腳};

struct led_data led_info;/** Open the device; in fact, there's nothing to do here.*/int testled_open (struct inode *inode, struct file *filp){return 0;}

ssize_t testled_read(struct file *file, char __user *buff, size_t count, loff_t *offp){return 0;}

ssize_t testled_write(struct file *file, const char __user *buff, size_t count, loff_t *offp){return 0;}

static long testled_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg){ switch (cmd) { case LED1CTRL_ON_CMD: { gpio_direction_output(led_info.led1_pin,1); break; } case LED1CTRL_OFF_CMD: { gpio_direction_output(led_info.led1_pin,0); break; } case LED2CTRL_ON_CMD: { gpio_direction_output(led_info.led2_pin,1); break;} case LED2CTRL_OFF_CMD: {gpio_direction_output(led_info.led2_pin,0); break;} default: { printk("testled compat Default %d\n",cmd); break;}}return 0;}

long testled_ioctl(struct file *file, unsigned int cmd, unsigned long arg){switch (cmd) {case LED1CTRL_ON_CMD: {gpio_direction_output(led_info.led1_pin,1);break;}case LED1CTRL_OFF_CMD: {gpio_direction_output(led_info.led1_pin,0);break;}case LED2CTRL_ON_CMD: {gpio_direction_output(led_info.led2_pin,1);break;}case LED2CTRL_OFF_CMD: {gpio_direction_output(led_info.led2_pin,0);break;}default: {printk("testled Default %d\n",cmd);break;}}return 0;

}

static int testled_release(struct inode *node, struct file *file){return 0;}

/** Our various sub-devices.*//* Device 0 uses remap_pfn_range */static struct file_operations testled_remap_ops = {.owner = THIS_MODULE,.open = testled_open,.release = testled_release,.read = testled_read,.write = testled_write,.unlocked_ioctl = testled_ioctl,.compat_ioctl = testled_compat_ioctl,};

static struct miscdevice testled_misc = {.minor = MISC_DYNAMIC_MINOR,.name = "test-led",.fops = &testled_remap_ops,};/** Module housekeeping.*/

static int testled_probe(struct platform_device *pdev){int ret;struct device_node *led_node = pdev->dev.of_node;//enum of_gpio_flags work_flags;

ret = misc_register(&testled_misc);if(ret < 0){pr_err("testled_misc_register fails!!!\n");return ret;}

led_info.led1_pin = of_get_named_gpio(led_node, "led1-work", 0);if(!gpio_is_valid(led_info.led1_pin)){pr_err("led1 pin invaild: %d",led_info.led1_pin);ret = -ENODEV;goto probe_fail;}

ret = gpio_request(led_info.led1_pin, "led1_pin");if(ret < 0){pr_err("led1 pin request failed.");goto probe_fail;}

led_info.led2_pin = of_get_named_gpio(led_node, "led2-work", 0);if(!gpio_is_valid(led_info.led2_pin)){pr_err("led2 pin invaild: %d",led_info.led2_pin);ret = -ENODEV;goto probe_fail;}

ret = gpio_request(led_info.led2_pin, "led2_pin");if(ret < 0){pr_err("led2 pin request failed.");goto probe_fail;}
printk("led1 pin is: %d,led2 pin is: %d",led_info.led1_pin,led_info.led2_pin);return 0;

probe_fail:

return ret;}

static int testled_remove(struct platform_device *pdev){pr_err("testled_misc_remove!!!\n");misc_deregister(&testled_misc);return 0;}

static struct of_device_id testled_table[] = {{ .compatible = "test,leds",}, //Compatible node must match dts{ },};

static struct platform_driver testled_driver = {.probe = testled_probe,.remove = testled_remove,.driver = {.name = "test_leds",.owner = THIS_MODULE,.of_match_table = testled_table,}};

static int testled_init(void){int ret;ret = platform_driver_register(&testled_driver);if(ret < 0)pr_err("platform_register_driver fails!!!\n");pr_err("platform_register_driver succeeds :ret=%d!!!\n",ret);return ret;}



static void testled_cleanup(void){platform_driver_unregister(&testled_driver);}

module_init(testled_init);module_exit(testled_cleanup);

3)Makefile文件(kernel/drivers/gpio/Makefile)

obj-$(CONFIG_GPIO_TEST_LED) += gpio-testled.o

4) Kconfig文件 (kernel/drivers/gpio/Kconfig)

config GPIO_TEST_LEDbool "select test leds"default y

5)驅(qū)動(dòng)配置文件(kernel/arch/arm64/configs/nanopi4_nougat_defconfig)

CONFIG_GPIO_TEST_LED=y

6)修改節(jié)點(diǎn)權(quán)限(device/rockchip/common/ueventd.rockchip.rc)

/dev/test_leds 0666 system system
設(shè)備驅(qū)動(dòng)文件在與 dts匹配的關(guān)鍵字是 compatible 屬性。即比較驅(qū)動(dòng)文件中 of_device_id 結(jié)構(gòu)體元素的 .compatible 成員變量和 dts 文件中 node 中 compatible 屬性兩個(gè)字符串,匹配成功之后會(huì)進(jìn)行probe,驅(qū)動(dòng)就被加載進(jìn)內(nèi)核了。Dts文件可以放入一些數(shù)據(jù)、屬性等,驅(qū)動(dòng)文件加載是可以來(lái)讀取,這樣如果更改硬件管腳等就不需要改動(dòng)驅(qū)動(dòng)文件,只改設(shè)備樹(shù)文件即可,使得驅(qū)動(dòng)移植和維護(hù)更加方便。
Makefile文件、Kconfig文件和驅(qū)動(dòng)配置文件使得gpio-testled.c的驅(qū)動(dòng)可以被編譯進(jìn)內(nèi)核,簡(jiǎn)易調(diào)試也可以只在Makefile文件添加 obj-y += gpio-testled.o就行。
驅(qū)動(dòng)加載成功的標(biāo)志是在設(shè)備的dev/目錄下生成了test-led的設(shè)備文件節(jié)點(diǎn),后面的上層就是以此文件來(lái)調(diào)用led驅(qū)動(dòng)的。


二、驅(qū)動(dòng)測(cè)試

驅(qū)動(dòng)完成后要測(cè)試一下驅(qū)動(dòng)對(duì)外的接口函數(shù)是否正常,可以寫(xiě)一個(gè)簡(jiǎn)易的測(cè)試代碼。
  1. 測(cè)試代碼gpioleds_test.c

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <linux/ioctl.h>
#define LEDCTRL_MAGIC 'k'#define LED1CTRL_ON_CMD _IO (LEDCTRL_MAGIC, 1)#define LED1CTRL_OFF_CMD _IO (LEDCTRL_MAGIC, 2)#define LED2CTRL_ON_CMD _IO (LEDCTRL_MAGIC, 3)#define LED2CTRL_OFF_CMD _IO (LEDCTRL_MAGIC, 4)

int main(){int i = 0;int dev_fd;dev_fd = open("/dev/test-led",O_RDWR | O_NONBLOCK);if ( dev_fd == -1 ) {printf("Cann't open file /dev/test-led\n");exit(1);}printf("Led1 on\n");ioctl (dev_fd, LED1CTRL_ON_CMD,0);getchar();ioctl (dev_fd, LED1CTRL_OFF_CMD,0);printf("led1 off\n");
printf("Led2 on\n");ioctl (dev_fd, LED2CTRL_ON_CMD,0);getchar();ioctl (dev_fd, LED2CTRL_OFF_CMD,0);printf("led2 off\n");
close(dev_fd);return 0;}

2)Android.mkLOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \gpioleds_test.c

LOCAL_SHARED_LIBRARIES := \liblog \libc \libutils \libcrypto \libhardware \

LOCAL_MODULE := gpioleds_test

LOCAL_MODULE_TAGS :=

LOCAL_MODULE_PATH := $(LOCAL_PATH)

LOCAL_CFLAGS +=-D_FORTIFY_SOURCE=0

LOCAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

include $(BUILD_EXECUTABLE

3)編譯成可執(zhí)行文件

在安卓目錄external/下新建gpioleds_test目錄,將gpioleds_test.c和Android.mk拷貝進(jìn)目錄,編譯此目錄。
mmm external/gpioleds_test/

完成在目錄下生成二進(jìn)制文件gpioleds_test??截愡M(jìn)安卓設(shè)備。


4)測(cè)試

二進(jìn)制文件拷貝進(jìn)安卓設(shè)備后,賦予777權(quán)限,然后運(yùn)行。
Chmod 777 /data/user/gpioleds_test./ data/user/gpioleds_test


掃碼關(guān)注我們

看更多嵌入式案例



喜歡本篇內(nèi)容請(qǐng)給我們點(diǎn)個(gè)再看

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

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉