国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【學(xué)習(xí)筆記:GPIO驅(qū)動(dòng)開發(fā)】

這篇具有很好參考價(jià)值的文章主要介紹了【學(xué)習(xí)筆記:GPIO驅(qū)動(dòng)開發(fā)】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

gpio_request

快門驅(qū)動(dòng)芯片ms8837 輸入信號(hào)是兩個(gè)GPIO,最開始是在camera 驅(qū)動(dòng)中調(diào)用 gpio_request() 申請(qǐng)GPIO,當(dāng) open/close camera 的時(shí)候就可以調(diào)用 gpio_direction_output() 來控制快門的開、關(guān)。
在dts 中加入引腳配置:

kd_camera_hw1:kd_camera_hw1@1a040000 {
		compatible = "mediatek,imgsensor";
		cam2_vcama_d_ext = <&pio 162 0x0>; 
		cam_shutter_in1 = <&pio 163 0x0>;
		cam_shutter_in2 = <&pio 164 0x0>;
	};

在camera 驅(qū)動(dòng)中調(diào)用gpio_request() 去控制GPIO:

UINT32 XXX_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc)
{
	/* To Do : Check Sensor status here */
	int ret;
	struct device_node * node;
	SENSORDB("%s",__func__);
	if (pfFunc!=NULL)
		*pfFunc=&SensorFuncXXX;
	node = of_find_compatible_node(NULL, NULL, "mediatek,imgsensor");
	if (!node) {
		printk(" Get cust camera node failed!\n");
		return -ENODEV;
	}
	cam_shutter_in1  = of_get_named_gpio(node, "cam_shutter_in1", 0);
	ret = gpio_request(cam_shutter_in1,"cam_shutter_in1");
	if (ret) {
		printk("error: cam_shutter_in1 gpio_request\n");
		return -1;
	}
			
	ret = gpio_direction_output(cam_shutter_in1, 1);
	if (ret) {
		printk("error %s : cam_shutter_in1  gpio_direction_output failed\n",__func__);
		ret = -1;
	}
	cam_shutter_in2  = of_get_named_gpio(node, "cam_shutter_in2", 0);
	ret = gpio_request(cam_shutter_in2,"cam_shutter_in2");
	if (ret) {
		printk("error: cam_shutter_in2 gpio_request\n");
		return -1;
	}
		
	ret = gpio_direction_output(cam_shutter_in2, 0);
	if (ret) {
		printk("error %s : cam_shutter_in2  gpio_direction_output failed\n",__func__);
		ret = -1;
	}
	printk("cam_shutter_in1:%d, cam_shutter_in2:%d\n", cam_shutter_in1, cam_shutter_in2);
	return ERROR_NONE;
} /* SensorInit() */

這樣在open/close camera 的時(shí)間是可以正常調(diào)用的,但后續(xù)的開發(fā)遇到了問題,原來是想通過camera 的 feature control 來發(fā)送快門開、關(guān)指令,但是發(fā)現(xiàn)非常復(fù)雜,快門指令是要結(jié)合3A處理的,就先放棄了,轉(zhuǎn)而用 ioctl 的方法去實(shí)現(xiàn)。

SYSFS

看其它帖子,控制GPIO最簡單的方法是通過SYSFS:
export_store: invalid gpio 5,學(xué)習(xí),筆記,驅(qū)動(dòng)開發(fā)

make menuconfig

因?yàn)闆]有 /sys/class/gpio 路徑,需要通過make menuconfig,將GPIO 映射到sysfs 文件系統(tǒng)中。
在kernel-4.4/ 下 make menuconfig 失敗及解決方法:
export_store: invalid gpio 5,學(xué)習(xí),筆記,驅(qū)動(dòng)開發(fā)
配置后 out/.config 文件中CONFIG_GPIO_SYSFS is not set,可見并未生效;直接在kernel-4.4/arch/arm64/configs/*_defconfig 中加入:

CONFIG_GPIO_SYSFS=y

這下有 /dev/class/gpio 路徑了。

export

執(zhí)行第二步:echo 163 > export 時(shí)未生成gpio163 路徑,同時(shí)kernel log 報(bào)錯(cuò):
export_store: invalid GPIO 163
有可能是因?yàn)镚PIO 被占用了的原因,因?yàn)檫@個(gè)方法也不方便app去調(diào)用,所以暫時(shí)放棄。

GPIO驅(qū)動(dòng)

編譯

在kernel-4.4/drivers/gpio/ 下添加GPIO 驅(qū)動(dòng)文件 gpio-ms8837.c,同時(shí)修改kernel-4.4/drivers/gpio/ 下的Kconfig 和 Makefile:

+config GPIO_MS8837
+       tristate "MS8837 GPIOs"
+       help
+         This option enables support for on-chip GPIO found
+         on MS8837.
+obj-$(CONFIG_GPIO_MS8837)      += gpio-ms8837.o

注:Kconfig 也要改,只改Makefile 不會(huì)編譯gpio-ms8837.o

驅(qū)動(dòng)分析

static int __init gpio_shutter_init(void)
{
    int devno;
    dev_t num_dev;

    printk("%s is called. \n", __func__);

    alloc_chrdev_region(&num_dev, gpio_minor, 1, MYGPIO_NAME);

    gpio_major = MAJOR(num_dev);
    printk("gpio_major = %d. \n", gpio_major);

    gpio_class = class_create(THIS_MODULE, MYGPIO_NAME);

    devno = MKDEV(gpio_major, gpio_minor);

    cdev_init(&gpio_cdev, &gpio_ops);

    cdev_add(&gpio_cdev, devno, 1);

    device_create(gpio_class, NULL, devno, NULL, MYGPIO_NAME);//1

#ifdef MYGPIO_HW_ENABLE
    gpio_shutter_hw_init();
#endif

    return 0;
}

標(biāo)記1 處的device_create 負(fù)責(zé)在 /dev/ 下生成設(shè)備文件,屏蔽掉,設(shè)備文件就沒有創(chuàng)建。
那么設(shè)備文件是如何創(chuàng)建的呢?
class_create() 源碼:
kernel-4.4\drivers\base\class.c
device_create() 源碼:
kernel-4.4\drivers\base\core.c

class_create()
This is used to create a struct class pointer that can then be used in calls to device_create().(用于創(chuàng)建一個(gè)class 結(jié)構(gòu)體指針,用于device_create() 的調(diào)用。)class_create()調(diào)用后,會(huì)在/sys/class 下創(chuàng)建設(shè)備目錄。本文是創(chuàng)建了 /sys/class/shutter 。
device_create()
This function can be used by char device classes. A struct device will be created in sysfs, registered to the specified class.(該函數(shù)可用于字符型設(shè)備類。用于在sysfs 中創(chuàng)建device 結(jié)構(gòu)體,并注冊(cè)到特定的class 中。)device_create()調(diào)用后會(huì)在 /dev/下建立設(shè)備節(jié)點(diǎn),本文是/dev/shutter。這樣用戶層就可以 去訪問設(shè)備了。class 與 device 通過 /sys/devices/virtual/shutter/shutter 關(guān)聯(lián)。

export_store: invalid gpio 5,學(xué)習(xí),筆記,驅(qū)動(dòng)開發(fā)
剩下的就是 file_operations 了,read/write/ioctl 等,根據(jù)需求去實(shí)現(xiàn)。

static const struct file_operations gpio_ops={
    .owner = THIS_MODULE,
    .open  = gpio_ms8837_open,
    .unlocked_ioctl = gpio_ms8837_ioctl
};

補(bǔ)充:也可以通過mknod 指令去創(chuàng)建設(shè)備節(jié)點(diǎn)
mknod
[OPTION]… NAME TYPE [MAJOR MINOR]
export_store: invalid gpio 5,學(xué)習(xí),筆記,驅(qū)動(dòng)開發(fā)
export_store: invalid gpio 5,學(xué)習(xí),筆記,驅(qū)動(dòng)開發(fā)
export_store: invalid gpio 5,學(xué)習(xí),筆記,驅(qū)動(dòng)開發(fā)

參考文檔:
https://cloud.tencent.com/developer/article/1599571
https://zhuanlan.zhihu.com/p/442079581
http://blog.chinaunix.net/uid-22666248-id-3052861.html文章來源地址http://www.zghlxwxcb.cn/news/detail-769175.html

到了這里,關(guān)于【學(xué)習(xí)筆記:GPIO驅(qū)動(dòng)開發(fā)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 驅(qū)動(dòng)開發(fā)作業(yè)3——GPIO子系統(tǒng)

    作業(yè)1:在內(nèi)核模塊中啟用定時(shí)器,定時(shí)1s,讓LED1以1s為周期實(shí)現(xiàn)流水燈 ?myled.c(驅(qū)動(dòng)文件) ? ?作業(yè)2:基于GPIO子系統(tǒng)完成LED燈驅(qū)動(dòng)的注冊(cè),并利用應(yīng)用程序測(cè)試 ?chrdevled.c(驅(qū)動(dòng)文件) test.c(測(cè)試文件)

    2024年02月16日
    瀏覽(41)
  • Linux驅(qū)動(dòng)開發(fā):gpio子系統(tǒng)

    目錄 1、GPIO配置流程 2、GPIO子系統(tǒng)API 2.1?of_find_node_by_path 2.2 of_get_named_gpio 2.3 gpio_request 與?gpiod_get 與?gpiod_get_index 2.4?gpio_direction_input 與?gpiod_direction_input 2.5?gpio_direction_output 與?gpiod_direction_output 2.6?gpio_get_value 與?gpiod_get_value 2.7?gpio_set_value 與?gpiod_set_value 2.8? gpiod_get_from

    2024年02月12日
    瀏覽(17)
  • <Linux開發(fā)>驅(qū)動(dòng)開發(fā) -之-基于pinctrl/gpio子系統(tǒng)的beep驅(qū)動(dòng)

    <Linux開發(fā)>驅(qū)動(dòng)開發(fā) -之-基于pinctrl/gpio子系統(tǒng)的beep驅(qū)動(dòng)

    <Linux開發(fā)>驅(qū)動(dòng)開發(fā) -之-基于pinctrl/gpio子系統(tǒng)的beep驅(qū)動(dòng) 交叉編譯環(huán)境搭建: <Linux開發(fā)> linux開發(fā)工具-之-交叉編譯環(huán)境搭建 uboot移植可參考以下: <Linux開發(fā)> -之-系統(tǒng)移植 uboot移植過程詳細(xì)記錄(第一部分) <Linux開發(fā)> -之-系統(tǒng)移植 uboot移植過程詳細(xì)記錄(第二部分

    2024年02月13日
    瀏覽(18)
  • 【Linux驅(qū)動(dòng)開發(fā)】011 gpio子系統(tǒng)

    【Linux驅(qū)動(dòng)開發(fā)】011 gpio子系統(tǒng)

    前面我們編寫了基于設(shè)備樹的 LED 驅(qū)動(dòng),但是驅(qū)動(dòng)的本質(zhì)還是沒變,都是配置 LED 燈所使用的 GPIO 寄存器,驅(qū)動(dòng)開發(fā)方式和裸機(jī)基本沒啥區(qū)別。本章我們就來學(xué)習(xí)一下如何借助 pinctrl 和 gpio 子系統(tǒng)來簡化 GPIO 驅(qū)動(dòng)開發(fā)。? ?Linux 內(nèi)核針對(duì) PIN 的配置推出了 pinctrl 子系統(tǒng),對(duì)于

    2024年02月03日
    瀏覽(17)
  • Linux驅(qū)動(dòng)開發(fā)學(xué)習(xí)筆記

    (Trusted Firmware - Arm) tsv語法 p220 ‘P’:向分區(qū)或者設(shè)備燒寫固件。 ‘E’:空分區(qū)或設(shè)備,表示對(duì)應(yīng)的分區(qū)或設(shè)備不更新,相關(guān)的 Id項(xiàng)會(huì)被跳過。 ‘D’:刪除分區(qū)或設(shè)備。 TF_A的bl33部分是uboot,uboot的功能是引導(dǎo)、啟動(dòng)linux。 U-boot命令 一般環(huán)境變量存放在外部flash中,uboo

    2024年02月14日
    瀏覽(22)
  • OpenHarmony輕量系統(tǒng)開發(fā)【5】驅(qū)動(dòng)之GPIO點(diǎn)燈

    OpenHarmony輕量系統(tǒng)開發(fā)【5】驅(qū)動(dòng)之GPIO點(diǎn)燈

    摘要 :本文簡單介紹如何操作GPIO去點(diǎn)燈 適合群體 :適用于Hi3861開發(fā)板,L0輕量系統(tǒng)驅(qū)動(dòng)開發(fā) 5.1點(diǎn)燈例程源碼 先看最簡單得LED燈閃爍操作 源碼結(jié)構(gòu)如下: 第一個(gè)BUILD.gn文件內(nèi)容: 第二個(gè)BUILD.gn內(nèi)容: led_demo.c內(nèi)容: 編譯后燒錄進(jìn)去,應(yīng)該可以看到復(fù)位按鍵旁邊的LED燈一直在

    2024年02月07日
    瀏覽(19)
  • Linux驅(qū)動(dòng)開發(fā)之【pinctrl和gpio子系統(tǒng)】

    Linux驅(qū)動(dòng)開發(fā)之【pinctrl和gpio子系統(tǒng)】

    目錄 一、?pinctrl和gpio子系統(tǒng) 1.pinctrl子系統(tǒng) 1.1 pinctrl子系統(tǒng)簡介 1.2 pinctrl子系統(tǒng)驅(qū)動(dòng) 1.3 設(shè)備樹中添加pinctrl節(jié)點(diǎn)模版 2. gpio子系統(tǒng) 2.1 gpio子系統(tǒng)簡介 2.2 gpio子系統(tǒng)驅(qū)動(dòng) 2.3 gpio子系統(tǒng)API函數(shù) 2.4 設(shè)備樹中添加gpio節(jié)點(diǎn)模板 2.5 與gpio相關(guān)的OF函數(shù) 3. 驅(qū)動(dòng)程序編寫 3.1 驅(qū)動(dòng)入口函數(shù) 3

    2024年02月06日
    瀏覽(16)
  • 【Linux驅(qū)動(dòng)開發(fā)】012 gpio子系統(tǒng)API函數(shù)

    設(shè)置好設(shè)備樹以后, 在驅(qū)動(dòng)程序中就可以使用 gpio 子系統(tǒng)提供的 API 函數(shù)來操作指定的 GPIO, gpio 子系統(tǒng)向驅(qū)動(dòng)開發(fā)人員屏蔽了具體的讀寫寄存器過程。這就是驅(qū)動(dòng)分層與分離的好處,大家各司其職,做好自己的本職工作即可。 gpio 子系統(tǒng)提供的常用的 API 函數(shù)有下面幾個(gè):

    2023年04月18日
    瀏覽(24)
  • [驅(qū)動(dòng)開發(fā)]gpio子系統(tǒng)及中斷實(shí)現(xiàn)led亮滅

    編寫LED燈的驅(qū)動(dòng),使用GPIO子系統(tǒng),里面添加按鍵的中斷處理 1.應(yīng)用程序發(fā)送指令控制發(fā)光二極管亮滅 2.按鍵1按下,led1電位反轉(zhuǎn);按鍵2按下,led2電位反轉(zhuǎn);按鍵3按下,led3電位反轉(zhuǎn)? ?

    2024年02月14日
    瀏覽(18)
  • 全志H3-nanopi-duo2開發(fā)板GPIO驅(qū)動(dòng)開發(fā)

    全志H3-nanopi-duo2開發(fā)板GPIO驅(qū)動(dòng)開發(fā)

    編譯和更新Linux內(nèi)核: [ 注意: 這里我只需要編譯驅(qū)動(dòng)模塊,不需要編譯內(nèi)核,上一篇文章有編譯驅(qū)動(dòng)模塊的步驟] 編譯完成后會(huì)在arch/arm/boot/目錄下生成zImage,并且在arch/arm/boot/dts/目錄下生成dtb文件,dtb文件是設(shè)備樹二進(jìn)制文件。 假設(shè)SD卡的boot分區(qū)掛載在/media/SD/boot/,更新SD卡上的

    2024年02月05日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包