建设一个网站要钱吗龙岗网络科技有限公司
- 作者: 五速梦信息网
- 时间: 2026年04月20日 10:43
当前位置: 首页 > news >正文
建设一个网站要钱吗,龙岗网络科技有限公司,在线制作图片散发光芒,基金公司网站建设方案一.设备树中添加pinctl节点模板
1.创建对应的节点
同一个外设的 PIN 都放到一个节点里面#xff0c;打开 imx6ull-14x14-evk.dts#xff0c;在 iomuxc 节点 中的“imx6ul-evk”子节点下添加 “pinctrl_test” 节点。添加完成以后如下所示#xff1a;
pinctrl_test:test_g…一.设备树中添加pinctl节点模板
1.创建对应的节点
同一个外设的 PIN 都放到一个节点里面打开 imx6ull-14x14-evk.dts在 iomuxc 节点 中的“imx6ul-evk”子节点下添加 “pinctrl_test” 节点。添加完成以后如下所示
pinctrl_test:test_grp
{/* 具体的PIN信息 /
};
2.添加 “fslpins” 属性
设备树是通过属性来保存信息的因此我们需要添加一个属性属性名字一定要为“fsl,pins” 因为对于 I.MX 系列 SOC 而言 pinctrl 驱动程序是通过读取“fsl,pins”属性值来获取 PIN 的配 置信息完成以后如下所示
pinctrl_test: testgrp
{fsl,pins / 设备所使用的 PIN 配置信息 */;
};
3.在 “fslpins” 属性中添加 PIN 配置信息
最后在“fsl,pins”属性中添加具体的 PIN 配置信息完成以后如下所示
pinctrl_test: testgrp
{fsl,pins MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 config /config 是电器属性设置值/;
};
一.获取设备树中的 pin 信息 二.根据获取到的 pin 信息来设置 pin 的复用功能 三.根据获取到的 pin 信息设置 pin 的电器属性 二. gpio 子系统常用API函数 对于驱动开发人员设置好设备树以后就可以使用 gpio 子系统提供的 API 函数来操作指定 的 GPIO
1.申请 GPIO 管脚 - gpio_request
功能 申请一个 GPIO 管脚 成功时返回0失败时返回其他值
参数 gpio要申请的 gpio 标号使用 of_get_named_gpio从设备树获取该标号 label给 gpio 设置个名字
int gpio_request(unsigned gpio,const char *label);
2.释放 GPIO 管脚 - gpio_free
功能 释放 GPIO 管脚 无返回值
参数 gpio要释放的 gpio 编号
void gpio_free(unsigned gpio); 3.设置 GPIO 为输入 - gpio_direction_input
功能 设置某个 GPIO 管脚为输入 成功时返回0失败时返回负值
参数 gpio要设置的 gpio 编号
int gpio_direction_input(unsigned gpio);
4.设置 GPIO 为输出 - gpio_direction_output
功能 设置 GPIO 为输出并设置默认输出值 成功时返回0失败时返回负值
参数 gpio要设置的 gpio 编号 valueGPIO 默认输出值
int gpio_direction_output(unsigned gpio,int value);
5.获取 GPIO 的值 - gpio_get_value
功能 获取某个 GPIO 的值0 或 1 成功时返回读到的 GPIO 的值失败时返回负值
参数 gpio要读的 gpio 编号
int gpio_get_value(unsigned gpio);
6.设置 GPIO 的值 - gpio_set_value
功能 设置 GPIO 的值 无返回值
参数 gpio要设置的 gpio 编号 value要设置的值0 或 1
void gpio_set_value(unsigned gpio,int value);
三.gpio子系统 OF 函数
1.获取某个属性的GPIO数量 - of_gpio_named_count
功能 获取设备树某个属性里面定义了几个 GPIO 信息 成功时返回统计到的GPIO数量失败时返回负值
参数 np设备节点 propname要统计的 GPIO 属性
int of_gpio_named_count(struct device_node *np,const char *propname);
2.获取某个节点的GPIO数量 - of_gpio_count
功能 获取设备树中某节点的 GPIO 数量 成功时返回统计到的GPIO数量失败时返回负值
参数 np设备节点
int of_gpio_count(struct device_node *np);
3.获取GPIO编号 - of_get_named_gpio
功能 获取 GPIO 编号将设备树中类似gpio5 7 GPIO_ACTIVE_LOW的属性信息转换为对应的 GPIO 编号 成功时返回获取到的GPIO编号失败时返回负值
参数 np设备节点 propname包含要获取GPIO信息的属性名 indexGPIO索引一个属性里面可能包含多个GPIO此参数指定要获取哪个GPIO的编号如果只有一个GPIO信息的话此参数为0
int of_get_named_gpio(struct device_node *np,const char propname,int index);
四.在设备树下添加 gpio 节点模板
1.在/根节点下创建 test 设备节点
test
{};
2.添加 pinctrl 信息 在本章的 “一.设备树中添加pinctrl节点模板” 中创建的pinctrl_test节点此节点描述了test设备所使用的GPIO1_IO00这个pin的信息。我们要将这节点添加到test设备节点中。
test
{/ 添加pinctrl-names 属性此属性描述pinctrl名字为default /pinctrl-names default;/ 添加pinctrl-0节点引用了创建的pinctrl_test节点表示test设备所使用的PIN信息保存在pinctrl_test节点中 /pinctrl-0 pinctrl_test;/ 其他节点内容 /
};
3.添加 GPIO 属性信息
test
{/ 添加pinctrl-names 属性此属性描述pinctrl名字为default /pinctrl-names default;/ 添加pinctrl-0节点引用了创建的pinctrl_test节点表示test设备所使用的PIN信息保存在pinctrl_test节点中 /pinctrl-0 pinctrl_test;/ 添加GPIO属性信息表面test所使用的是GPIO1_IO00 低电平有效 /gpio gpio1 0 GPIO_ACTIVE_LOW;
};
五.驱动程序示例代码
1.设备树程序
①.流程图 ②.代码
(1).在设备树的iomuxc下添加pinctrl节点
将GPIO1_IO03的电器属性设置为 0X10B0 2.在根节点下创建LED设备节点 2.驱动程序
①.流程图 ②.代码
#include linux/types.h
#include linux/kernel.h
#include linux/delay.h
#include linux/ide.h
#include linux/init.h
#include linux/module.h
#include linux/errno.h
#include linux/gpio.h
#include linux/cdev.h
#include linux/device.h
#include linux/of.h
#include linux/of_address.h
#include linux/of_gpio.h
#include asm/mach/map.h
#include asm/uaccess.h
#include asm/io.h#define GPIOLED_CNT 1 / 设备号个数 /
#define GPIOLED_NAME gpioled / 名字 /
#define LEDOFF 0 / 关灯 /
#define LEDON 1 / 开灯 // gpioled设备结构体 /
struct gpioled_dev
{dev_t devid; / 设备号 /struct cdev cdev; / cdev */struct class class; / 类 */struct device device; / 设备 /int major; / 主设备号 /int minor; / 次设备号 */struct device_node nd; / 设备结点 /int led_gpio; / led所使用的 GPIO 编号 /
};/ led设备 /
struct gpioled_dev gpioled;/** description: 打开设备* param - inode : 传递给驱动的inode* param - filp : 设备文件* return : 0 成功其他 失败
*/
static int led_open(struct inode *inode,struct file filp)
{/ 设置私有属性 /filp-private_data gpioled; return 0;
}/** description: 从设备读取数据* param - filp : 要打开的设备文件文件描述符* param - buf : 返回给用户空间的数据缓冲区* param - cnt : 要读取的数据长度* param - offt : 相对于文件首地址的偏移* return : 读取的字节数如果为负值则为失败
*/
static ssize_t led_read(struct file *filp,char __user *buf,size_t cnt,loff_t offt)
{return 0;
}/** description: 向设备写数据* param - filp : 设备文件表示打开的文件描述符* param - buf : 要写给设备的数据* param - cnt : 要写入的数据长度* param - offt : 写入的字节数如果为负值则为失败
*/
static ssize_t led_write(struct file *filp,const char __user *buf,size_t cnt,loff_t *offt)
{int retvalue;unsigned char databuf[1];unsigned char ledstat;struct gpioled_dev dev filp-private_data;retvalue copy_from_user(databuf,buf,cnt);if(0 retvalue){printk(kernel write failed!\r\n);return -EFAULT;}ledstat databuf[0];if(ledstat LEDON){gpio_set_value(dev-led_gpio,0); //打开LED灯}else if(ledstat LEDOFF){gpio_set_value(dev-led_gpio,1); //关闭LED}return 0;
}/** description: 关闭/释放设备* param - filp : 要关闭的设备文件文件描述符* return : 0 成功其他 失败
*/
static int led_release(struct inode *inode,struct file filp)
{return 0 ;
}/ 绑定设备操作函数 /
static struct file_operations gpioled_fops
{.owner THIS_MODULE,.open led_open,.read led_read,.write led_write,.release led_release,
};/** description: 驱动入口函数* param : 无* return : 无
/
static int __init led_init(void)
{int ret 0;/ 设置LED所使用的GPIO // 1.从设备数中获取设备节点:gpioled /gpioled.nd of_find_node_by_path(/gpioled);if(NULL gpioled.nd){printk(gpioled node can not found!\r\n);}else{printk(gpioled node has been found!\r\n);}/ 2.获取设备数中的gpio属性得到LED所使用的LED编号 /gpioled.led_gpio of_get_named_gpio(gpioled.nd,led-gpio,0);if(0 gpioled.led_gpio){printk(can not get led-gpio);return -EINVAL;}printk(led-gpio num %d\r\n,gpioled.led_gpio);/ 3.初始化GPIO,默认关闭LED /ret gpio_direction_output(gpioled.led_gpio,1);if(0 ret){printk(can not init gpio!\r\n);}/ 注册字符设备驱动 // 1.创建设备号 /if(gpioled.major) //若定义了设备号{gpioled.devid MKDEV(gpioled.major,0);register_chrdev_region(gpioled.devid,GPIOLED_CNT,GPIOLED_NAME);}else //没有定义设备号{alloc_chrdev_region(gpioled.devid,0,GPIOLED_CNT,GPIOLED_NAME); //申请设备号gpioled.major MAJOR(gpioled.devid); //获取主设备号gpioled.minor MINOR(gpioled.devid); //获取次设备号}printk(gpioled major %d,minor %d,gpioled.major,gpioled.minor);/ 2.初始化cdev /gpioled.cdev.owner THIS_MODULE;cdev_init(gpioled.cdev,gpioled_fops);/ 3.添加一个cdev /cdev_add(gpioled.cdev,gpioled.devid,GPIOLED_CNT);/ 4.创建类 /gpioled.class class_create(THIS_MODULE,GPIOLED_NAME);if(IS_ERR(gpioled.class)){return PTR_ERR(gpioled.class);}/ 5.创建设备 /gpioled.device device_create(gpioled.class,NULL,gpioled.devid,NULL,GPIOLED_NAME);if(IS_ERR(gpioled.device)){return PTR_ERR(gpioled.device);}return 0;
}/** description: 驱动出口函数* param : 无* return : 无
/
static void __exit led_exit(void)
{/ 注销字符设备驱动 */cdev_del(gpioled.cdev); //删除cdevunregister_chrdev_region(gpioled.devid,GPIOLED_CNT); //注销device_destroy(gpioled.class,gpioled.devid);class_destroy(gpioled.class);
}module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE(GPL);
MODULE_AUTHOR(kaneki);
Makefile
KERNELDIR : /home/linux/IMX6ULL/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
CURRENT_PATH :\((shell pwd)
obj-m : gpioled.o
build: kernel_modules
kernel_modules:\)(MAKE) -C \((KERNELDIR) M\)(CURRENT_PATH) modules
clean:\((MAKE) -C \)(KERNELDIR) M$(CURRENT_PATH) clean
- 上一篇: 建设一个网站需要什么设备青海建设协会网站
- 下一篇: 建设一个微信小说网站四平网站公司
相关文章
-
建设一个网站需要什么设备青海建设协会网站
建设一个网站需要什么设备青海建设协会网站
- 技术栈
- 2026年04月20日
-
建设一个网站需要多长时间深圳建站公司服务
建设一个网站需要多长时间深圳建站公司服务
- 技术栈
- 2026年04月20日
-
建设一个网站平台的费用吗中海外交通建设有限公司网站
建设一个网站平台的费用吗中海外交通建设有限公司网站
- 技术栈
- 2026年04月20日
-
建设一个微信小说网站四平网站公司
建设一个微信小说网站四平网站公司
- 技术栈
- 2026年04月20日
-
建设一个小说网站要多少钱广西建设网官网办事大厅桂建云
建设一个小说网站要多少钱广西建设网官网办事大厅桂建云
- 技术栈
- 2026年04月20日
-
建设一个中英文双版的网站wordpress源码 优惠券
建设一个中英文双版的网站wordpress源码 优惠券
- 技术栈
- 2026年04月20日
