中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

做二手房比較好的網(wǎng)站有哪些阿亮seo技術(shù)顧問(wèn)

做二手房比較好的網(wǎng)站有哪些,阿亮seo技術(shù)顧問(wèn),濟(jì)南做網(wǎng)站找泉諾,蠡縣住房和城鄉(xiāng)建設(shè)局網(wǎng)站本文檔提供了在 Android 10 設(shè)備上通過(guò)應(yīng)用程序(App)控制通用輸入輸出(GPIO)的詳細(xì)指南。這涵蓋了從創(chuàng)建 gpio驅(qū)動(dòng)到App 配置 以及 SELinux 策略以允許特定訪問(wèn)的所有必要步驟。 1. 驅(qū)動(dòng)實(shí)現(xiàn) 添加創(chuàng)建gpio控制驅(qū)動(dòng)bsp\kernel\ke…

本文檔提供了在?Android?10?設(shè)備上通過(guò)應(yīng)用程序(App)控制通用輸入輸出(GPIO)的詳細(xì)指南。這涵蓋了從創(chuàng)建?gpio驅(qū)動(dòng)到App?配置?以及?SELinux?策略以允許特定訪問(wèn)的所有必要步驟。

1. 驅(qū)動(dòng)實(shí)現(xiàn)

添加創(chuàng)建gpio控制驅(qū)動(dòng)bsp\kernel\kernel4.14\drivers\gpio\gpio_led.c,并添加好對(duì)應(yīng)的Makfile編譯

#include?<linux/init.h>#include?<linux/slab.h>#include?<linux/module.h>#include?<linux/kernel.h>#include?<linux/fs.h>#include?<linux/cdev.h>#include?<linux/device.h>#include?<linux/ioctl.h>#include?<linux/uaccess.h>#include?<linux/string.h>#include?<linux/wait.h>#include?<linux/types.h>#include?<linux/proc_fs.h>#include?<linux/of.h>#include?<linux/of_gpio.h>#include?<linux/gpio.h>#include?<linux/delay.h>#include?<linux/platform_device.h>#include?<linux/err.h>#include?<linux/gpio/consumer.h>#include?<linux/io.h>#include?<linux/miscdevice.h>#include?<linux/irq.h>#include?<linux/of_irq.h>#include?<linux/kernel.h>#include?<linux/dmi.h>#include?<linux/firmware.h>#include?<linux/gpio/consumer.h>#include?<linux/input.h>#include?<linux/input/mt.h>#include?<linux/module.h>#include?<linux/delay.h>#include?<linux/irq.h>#include?<linux/interrupt.h>#include?<linux/slab.h>#include?<linux/acpi.h>#include?<linux/of.h>#include?<asm/unaligned.h>#define?GPIO_HIGH?_IO('L',?0)#define?GPIO_LOW?_IO('L',?1)#define?LED_ON?1#define?LED_OFF?0#define?SIMPIE_LED_MAX?4//==============================?Upper?interface?value?==============================////?驅(qū)動(dòng)模塊名稱(chēng)定義#define?MODULE_NAME?"gpio_led"??????????//?驅(qū)動(dòng)模塊的名字#define?MISC_NAME?"gpio_led_device"?????//?用于注冊(cè)為“misc”設(shè)備的名字//?模塊函數(shù)接口定義,供上層應(yīng)用調(diào)用的接口。通過(guò)MM_DEV_MAGIC區(qū)分不同系統(tǒng)接口,通過(guò)_IO()加上自己的編號(hào)作為接口number。#define?MM_DEV_MAGIC?'N'//?LED?控制命令#define?RFID_IO1?_IO(MM_DEV_MAGIC,?93)#define?RFID_IO2?_IO(MM_DEV_MAGIC,?130)#define?RFID_IO3?_IO(MM_DEV_MAGIC,?121)#define?RFID_LED?_IO(MM_DEV_MAGIC,?138)static?int?major;static?struct?class?*cls;//?GPIO?描述數(shù)組struct?gpio_desc?*led_gpio[SIMPIE_LED_MAX];//?cat命令將調(diào)用該函數(shù)static?ssize_t?gpio_value_show(struct?device?*dev,?struct?device_attribute?*attr,?char?*buf){return?sprintf(buf,?"%d\n",?gpiod_get_value(led_gpio[0]));}//?echo命令將調(diào)用該函數(shù)static?ssize_t?gpio_value_store(struct?device?*dev,?struct?device_attribute?*attr,?const?char?*buf,?size_t?len){pr_err("[vanxoak]%c\n",?buf[0]);if?('0'?==?buf[0]){gpiod_direction_output(led_gpio[0],?0);pr_err("[vanxoak]:?_%s_?:gpio?off\n",?__func__);}else?if?('1'?==?buf[0]){gpiod_direction_output(led_gpio[0],?1);pr_err("[vanxoak]:?_%s_?:gpio?on\n",?__func__);}elsepr_err("I?only?support?0?or?1?to?ctrl?gpio?on?or?off\n");pr_err("[vanxoak]gpio_value_store\n");return?len;}//?定義一個(gè)名為gpio_led的設(shè)備屬性static?DEVICE_ATTR(gpio_led,?0664,?gpio_value_show,?gpio_value_store);//?提供給上層控制的接口long?gpio_led_ioctl(struct?file?*file,?unsigned?int?cmd,?unsigned?long?arg){switch?(cmd){case?RFID_LED:gpiod_direction_output(led_gpio[0],?arg);break;case?RFID_IO1:gpiod_direction_output(led_gpio[1],?arg);break;case?RFID_IO2:gpiod_direction_output(led_gpio[2],?arg);break;case?RFID_IO3:gpiod_direction_output(led_gpio[3],?arg);break;default:pr_err("[vanxoak]?%s?default:?break\n",?__func__);break;}return?0;}struct?file_operations?gpio_led_ops?=?{.owner?=?THIS_MODULE,.unlocked_ioctl?=?gpio_led_ioctl,};//?LED燈初始化static?int?simpie_led_init(struct?platform_device?*pdev){int?ret?=?0;int?i;//?申請(qǐng)gpio設(shè)備led_gpio[0]?=?devm_gpiod_get(&pdev->dev,?"led0",?GPIOD_OUT_LOW);led_gpio[1]?=?devm_gpiod_get(&pdev->dev,?"led1",?GPIOD_OUT_LOW);led_gpio[2]?=?devm_gpiod_get(&pdev->dev,?"led2",?GPIOD_OUT_LOW);led_gpio[3]?=?devm_gpiod_get(&pdev->dev,?"led3",?GPIOD_OUT_LOW);for?(i?=?0;?i?<?SIMPIE_LED_MAX;?i++){if?(IS_ERR(led_gpio[i])){ret?=?PTR_ERR(led_gpio[i]);return?ret;}//?輸出初始電平ret?=?gpiod_direction_output(led_gpio[i],?LED_OFF);}device_create_file(&pdev->dev,?&dev_attr_gpio_led);return?ret;}//?驅(qū)動(dòng)入口static?int?gpio_led_probe(struct?platform_device?*pdev){int?ret?=?0;pr_err("[vanxoak]gpio_led_probe?start...\n");//?LED燈gpio初始化及輸出配置ret?=?simpie_led_init(pdev);pr_err("[vanxoak]gpio_led_probe?end...\n");return?0;}//?綁定設(shè)備static?struct?of_device_id?gpio_led_match_table[]?=?{{.compatible?=?"yz,gpio-led"},{}};static?int?gpio_led_remove(struct?platform_device?*pdev){pr_err("[vanxoak]gpio_led_remove...\n");return?0;}static?struct?platform_driver?gpio_led_driver?=?{.driver?=?{.name?=?MODULE_NAME,.owner?=?THIS_MODULE,.of_match_table?=?gpio_led_match_table,},.probe?=?gpio_led_probe,.remove?=?gpio_led_remove,};//?gpio初始化入口static?int?gpio_led_init(void){struct?device?*mydev;pr_err("[vanxoak]gpio_led_init?start...\n");platform_driver_register(&gpio_led_driver);major?=?register_chrdev(0,?"gpiotest",?&gpio_led_ops);//?創(chuàng)建gpio_led_class設(shè)備cls?=?class_create(THIS_MODULE,?"gpio_led_class");//?在gpio_led_class設(shè)備目錄下創(chuàng)建一個(gè)gpio_led_device屬性文件mydev?=?device_create(cls,?0,?MKDEV(major,?0),?NULL,?MISC_NAME);if?(sysfs_create_file(&(mydev->kobj),?&dev_attr_gpio_led.attr)){return?-1;}return?0;}static?void?gpio_led_exit(void){pr_err("[vanxoak]gpio_led_exit...\n");platform_driver_unregister(&gpio_led_driver);device_destroy(cls,?MKDEV(major,?0));class_destroy(cls);unregister_chrdev(major,?"gpiotest");}module_init(gpio_led_init);module_exit(gpio_led_exit);MODULE_DESCRIPTION("Device_create?Driver");MODULE_LICENSE("GPL");

設(shè)備樹(shù)配置?

gpio_led:?yz,gpio-led?{status?=?"disabled";compatible?=?"yz,gpio-led";led0-gpio?=?<&ap_gpio?138?GPIO_ACTIVE_HIGH>;led1-gpio?=?<&ap_gpio?93?GPIO_ACTIVE_HIGH>;led2-gpio?=?<&ap_gpio?130?GPIO_ACTIVE_HIGH>;led3-gpio?=?<&ap_gpio?121?GPIO_ACTIVE_HIGH>;};

配置好上面gpio驅(qū)動(dòng)后重新編譯更新kernel?可以在/dev目錄下找到對(duì)應(yīng)的設(shè)備文件

"/dev/gpio_led_device",通過(guò)讀寫(xiě)設(shè)備文件就可以操作gpio了。

1.2 創(chuàng)建?Native?庫(kù)

1.2.1設(shè)置?JNI?方法

在?App?中定義?JNI?方法以實(shí)現(xiàn)與?GPIO?設(shè)備的交互。

public?class?NativeClass?{static?{try?{System.loadLibrary("jni_gpiocontrol");Log.d("NativeClass",?"Native?library?loaded?successfully.");}?catch?(UnsatisfiedLinkError?e)?{Log.e("NativeClass",?"Failed?to?load?native?library:?"?+?e.getMessage());//?throw?new?RuntimeException("Failed?to?load?native?library",?e);}}//?聲明本地方法public?native?int?controlGPIO(int?cmd,?long?arg);
}
1.2.2 實(shí)現(xiàn)?Native?方法

在app/src/main目錄下創(chuàng)建一個(gè)cpp文件夾(如果你的項(xiàng)目是用Kotlin編寫(xiě)的,這個(gè)步驟仍然適用,因?yàn)镴NI是用C/C++實(shí)現(xiàn)的)。將你的libjni_gpiocontrol.cpp文件放到這個(gè)cpp目錄中。

注意事項(xiàng):確保本地方法簽名正確,Java方法簽名和本地(C/C++)方法實(shí)現(xiàn)之間必須完全匹配。

#include?<jni.h>#include?<fcntl.h>#include?<unistd.h>#include?<sys/ioctl.h>#include?<stdio.h>#include?<android/log.h>#include?<errno.h>#include?<string.h>#define?MM_DEV_MAGIC?'N'#define?RFID_LED?_IO(MM_DEV_MAGIC,?138)#define?RFID_IO1?_IO(MM_DEV_MAGIC,?93)#define?RFID_IO2?_IO(MM_DEV_MAGIC,?130)#define?RFID_IO3?_IO(MM_DEV_MAGIC,?121)#define?DEVICE_PATH?"/dev/gpio_led_device"#define?LOG_TAG?"GPIOControl"extern?"C"?JNIEXPORT?jint?JNICALLJava_com_example_gpio_NativeClass_controlGPIO(JNIEnv?*env,?jobject?obj,?jint?cmd,?jlong?arg)?{int?device_fd;long?ioctl_result;unsigned?int?ioctl_cmd?=?cmd;//?Open?the?device?filedevice_fd?=?open(DEVICE_PATH,?O_RDWR);if?(device_fd?<?0)?{__android_log_print(ANDROID_LOG_ERROR,?LOG_TAG,?"Could?not?open?device:?%s",?strerror(errno));return?-1;}//?Translate?cmd?to?appropriate?ioctl?command?based?on?inputswitch?(cmd)?{case?138:ioctl_cmd?=?RFID_LED;break;case?93:ioctl_cmd?=?RFID_IO1;break;case?130:ioctl_cmd?=?RFID_IO2;break;case?121:ioctl_cmd?=?RFID_IO3;break;default:__android_log_print(ANDROID_LOG_ERROR,?LOG_TAG,?"Invalid?command");close(device_fd);return?-1;}//?Send?an?ioctl?to?the?deviceioctl_result?=?ioctl(device_fd,?ioctl_cmd,?arg);if?(ioctl_result?<?0)?{__android_log_print(ANDROID_LOG_ERROR,?LOG_TAG,?"Failed?to?call?ioctl:?%s",?strerror(errno));close(device_fd);return?-1;}//?Close?the?deviceclose(device_fd);return?0;}

1.2.3 編譯?Native?庫(kù)

使用?CMake?或?ndk-build?工具編譯你的?native?代碼為共享庫(kù)(.so?文件)。

添加app\src\main\cpp\CMakeLists.txt?

cmake_minimum_required(VERSION?3.4.1)project("gpiotest")add_library(jni_gpiocontrol?SHARED?libjni_gpiocontrol.cpp)find_library(?log-lib?log?)target_link_libraries(jni_gpiocontrol${log-lib}?)?
1.2.4 調(diào)用?Native?方法

通過(guò)?JNI?接口在?App?中調(diào)用實(shí)現(xiàn)的?native?方法以控制?GPIO。

public?class?MainActivity?extends?AppCompatActivity?{private?NativeClass?nativeClass;@Overrideprotected?void?onCreate(Bundle?savedInstanceState)?{super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);nativeClass?=?new?NativeClass();//?示例:打開(kāi)LEDint?result?=?nativeClass.controlGPIO(138,?1);//?根據(jù)result處理結(jié)果}}

2. SELinux?配置

由于直接訪問(wèn)硬件設(shè)備在?Android?中受到?SELinux?策略的限制,需要修改?SELinux?策略以允許?App?訪問(wèn)?GPIO?設(shè)備文件。

定義設(shè)備類(lèi)型:為?GPIO?設(shè)備定義一個(gè)新的?SELinux?類(lèi)型(如?gpio_led_device_t)。

在SDK_dir/device/sprd/sharkle/common/sepolicy/device.te?添加

#?定義新的設(shè)備類(lèi)型type?gpio_led_device_t,?dev_type;

分配文件上下文:為?GPIO?設(shè)備文件分配新定義的?SELinux?類(lèi)型。

SDK_dir/device/sprd/sharkle/common/sepolicy/file_contexts中添加

/dev/gpio_led_device?u:object_r:gpio_led_device_t:s0

授予權(quán)限:在?SELinux?策略中添加規(guī)則,允許?App?訪問(wèn)?GPIO?設(shè)備。

SDK_dir/device/sprd/sharkle/common/sepolicy/system_app.te

#?允許?system_app?訪問(wèn)?gpio_led_deviceallow?system_app?gpio_led_device_t:chr_file?{?read?write?};

重新編譯?SELinux?策略:對(duì)更改的?SELinux?策略進(jìn)行編譯,并將其部署到設(shè)備上。這一步驟的目的是將自定義的安全策略更改應(yīng)用到Android構(gòu)建系統(tǒng)的預(yù)設(shè)SELinux策略中,確保在編譯系統(tǒng)鏡像時(shí),這些更改會(huì)被包含進(jìn)去。

cp?system/sepolicy/public/app.te?system/sepolicy/prebuilts/api/29.0/public/app.tecp?system/sepolicy/private/coredomain.te?system/sepolicy/prebuilts/api/29.0/private/coredomain.te

3. 測(cè)試與部署

測(cè)試?App:在具有所需硬件支持的?Android?10?設(shè)備上測(cè)試?App。確保?App?能成功加載?native?庫(kù),并能通過(guò)?JNI?調(diào)用控制?GPIO。

SELinux?策略測(cè)試:驗(yàn)證?SELinux?策略更改是否允許?App?無(wú)障礙地訪問(wèn)?GPIO?設(shè)備。

問(wèn)題排查:如果遇到訪問(wèn)被拒絕的情況,請(qǐng)檢查?SELinux?審計(jì)日志以確定是否需要進(jìn)一步調(diào)整策略。

3.1注意事項(xiàng)

安全性:在修改?SELinux?策略以增加訪問(wèn)權(quán)限時(shí),務(wù)必小心謹(jǐn)慎,避免引入安全漏洞。

設(shè)備兼容性:確保你的實(shí)現(xiàn)考慮到了不同設(shè)備可能存在的硬件和配置差異。

文檔和維護(hù):適當(dāng)記錄你的設(shè)計(jì)和實(shí)現(xiàn)過(guò)程,包括?JNI?接口、native?代碼和?SELinux?策略更改,以便于未來(lái)的審計(jì)和維護(hù)。

通過(guò)遵循以上步驟,你可以在遵守?Android?安全模型的同時(shí),實(shí)現(xiàn)?App?對(duì)?GPIO?的有效控制。

http://www.risenshineclean.com/news/49929.html

相關(guān)文章:

  • 實(shí)體企業(yè)做網(wǎng)站好么網(wǎng)絡(luò)營(yíng)銷(xiāo)是做什么的
  • 不建議網(wǎng)站企業(yè)網(wǎng)站有哪些平臺(tái)
  • b2b特點(diǎn)優(yōu)化關(guān)鍵詞哪家好
  • 網(wǎng)站開(kāi)發(fā)答辯記錄表網(wǎng)絡(luò)營(yíng)銷(xiāo)最新案例
  • 做互聯(lián)網(wǎng)網(wǎng)站待遇百度廣告代理商查詢(xún)
  • 合肥個(gè)人建站模板廣東省疫情最新
  • 網(wǎng)站安裝步驟頁(yè)面電商入門(mén)基礎(chǔ)知識(shí)
  • 做網(wǎng)站通過(guò)什么掙錢(qián)如何做推廣宣傳
  • 做城通網(wǎng)盤(pán)資源網(wǎng)站的源碼關(guān)鍵詞app下載
  • 如何在網(wǎng)站上做用工登記天津百度seo
  • 沂南網(wǎng)站建設(shè)技能培訓(xùn)網(wǎng)站
  • 杭州網(wǎng)站定制開(kāi)發(fā)自助建站申請(qǐng)
  • 公司想建一個(gè)網(wǎng)站找誰(shuí)做百度網(wǎng)頁(yè)版登錄
  • 男女怎樣做那個(gè)視頻網(wǎng)站百度推廣咨詢(xún)
  • 阿里云9元做網(wǎng)站營(yíng)銷(xiāo)方法有哪些
  • 網(wǎng)站切圖誰(shuí)來(lái)完成濟(jì)寧網(wǎng)站建設(shè)
  • 做分類(lèi)網(wǎng)站用什么cms網(wǎng)推接單平臺(tái)
  • GPS實(shí)時(shí)定位網(wǎng)站怎么做抖音關(guān)鍵詞搜索排名
  • 那里做直播網(wǎng)站搜索引擎優(yōu)化指的是
  • 姓名域名亞馬遜seo什么意思
  • WordPress模版二次元長(zhǎng)沙有實(shí)力seo優(yōu)化
  • 網(wǎng)站建設(shè)規(guī)劃北京今日重大新聞
  • 網(wǎng)站開(kāi)發(fā)采購(gòu)合同模板下載b2b
  • 做素材網(wǎng)站存儲(chǔ)搜索最多的關(guān)鍵詞的排名
  • 廣東網(wǎng)站建設(shè)微信官網(wǎng)開(kāi)發(fā)網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃模板
  • 哪兒提供邢臺(tái)做網(wǎng)站windows系統(tǒng)優(yōu)化軟件排行榜
  • 一個(gè)公網(wǎng)ip可以做幾個(gè)網(wǎng)站青島官網(wǎng)seo方法
  • 怎么做網(wǎng)站企業(yè)文化欄目網(wǎng)站推廣途徑和推廣要點(diǎn)
  • 24小時(shí)學(xué)會(huì)網(wǎng)站建設(shè) 下載定制網(wǎng)站開(kāi)發(fā)
  • 聯(lián)通做網(wǎng)站寧波seo網(wǎng)站推廣軟件