(三)採用pinctrl控制系統控制GPIO

2021-10-02 14:21:39 字數 3390 閱讀 2933

管理系統中所有的可以控制的pin,在系統初始化的時候,列舉所有可以控制的pin,並標識這些pin,主要是獲取到pinctrl系統中gpio對應的編號,然後呼叫gpio 的操作函式進行操作。

在對應的裝置樹pinctrl節點上新增驅動的gpio資訊。

pinctrl_led:ledgrp

;

之後在根/下面新增自己的gpio節點

gpioled

;

其中led-gpio這個節點名字要記住,因為後續驅動**通過他來獲取道gpio的number,進而對其進行初始化話和控制。

以上裝置樹修改是基於imx6ull的。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define pinctrl_led_name "pinctrled"

#define pinctrl_led_ct 1

#define led_on 1

#define led_off 0

struct pinctrl_led_struct

;struct pinctrl_led_struct pinctrl_led_dev;

static

intpinctrl_led_open

(struct inode *inode,

struct file *file)

static

intpinctrl_led_release

(struct inode *inode,

struct file *file)

ssize_t pinctrl_led_write

(struct file *file,

const

char __user *data,size_t len, loff_t *ppos)

if(data_tmp == led_on)

else

if(data_tmp == led_off)

return0;

}ssize_t pinctrl_led_read

(struct file *file,

char __user * buf,size_t len, loff_t * ppos)

static

const

struct file_operations pinctrl_led_fileops =

;int

led_init

(void

)printk

("find node\r\n");

pinctrl_led_dev.gpio =

of_get_named_gpio

(pinctrl_led_dev.nd,

"led-gpio",0

);if(pinctrl_led_dev.gpio <0)

printk

("get gpio num:%d\r\n"

,pinctrl_led_dev.gpio)

; ret =

gpio_direction_output

(pinctrl_led_dev.gpio,1)

;if(ret <0)

return0;

}static

int __init pinctrl_led_init

(void

) pinctrl_led_dev.major =0;

/* register our major, and accept a dynamic number. */

if(pinctrl_led_dev.major)

else

if(ret <0)

printk

("pinctrl_led major:%#x\r\n"

,pinctrl_led_dev.major)

; pinctrl_led_dev.cdev.owner = this_module;

cdev_init

(&pinctrl_led_dev.cdev,

&pinctrl_led_fileops)

; ret =

cdev_add

(&pinctrl_led_dev.cdev, pinctrl_led_dev.devid, pinctrl_led_ct);if

(ret <0)

pinctrl_led_dev.class =

class_create

(this_module, pinctrl_led_name);if

(is_err

(pinctrl_led_dev.class)

) pinctrl_led_dev.device =

device_create

(pinctrl_led_dev.class,

null

, pinctrl_led_dev.devid,

null

,pinctrl_led_name);if

(is_err

(pinctrl_led_dev.device)

)return0;

device_err:

class_destroy

(pinctrl_led_dev.class)

;class_err:

cdev_del

(&pinctrl_led_dev.cdev)

;cdev_err:

unregister_chrdev_region

(pinctrl_led_dev.devid, pinctrl_led_ct)

; chrdev_err:

return ret;

}static

void __exit pinctrl_led_exit

(void

)module_init

(pinctrl_led_init)

;module_exit

(pinctrl_led_exit)

;module_license

("gpl");

module_author

("gale"

);

通過這種方式來修改,後續只需要修改裝置樹,即可完成gpio的初始化,相對來講呼叫pinctrl控制系統來驅動gpio,稍微簡單一點,不需要自己去對映虛擬位址之類的。

控制系統設計 非線性控制系統設計

控制設計的目標可以敘述如下 對於給定的被控物理系統和系統期望性態的規範,構造反饋控制規律,使得系統呈現出期望的性態。兩類基本的非線性控制問題 非線性調節和非線性跟蹤 非線性控制所期望的性態 構造非線性控制器的基本問題 可利用的非線性控制器設計方法。1.1.鎮定問題 漸近鎮定問題 給定由方程 描述的非...

交通控制系統

設計要求 用vhdl語言設計乙個由一條主幹道和一條支幹道的匯合點形成的十字交叉路口的交通燈控制器,要求如下 1 主 支幹道各設乙個紅 綠 黃指示燈,led顯示 2 主幹道處於常允許通行狀態,支幹道有車來的時候才允許通行 主幹道允許通行時亮綠燈,支幹道紅燈。支幹道允許通行時亮綠燈,主幹道亮紅燈 3 主...

版本控制系統

linux一直痛恨的cvs及svn都是集中式的版本控制系統,而git是分布式版本控制系統,集中式和分布式版本控制系統有什麼區別呢?1 集中式版本控制系統 代表 svn cvs 版本庫是集中存放在 伺服器的,而幹活的時候,用的都是自己的電腦,所以要先從 伺服器取得最新的版本,然後開始幹活,幹完活了,再...