当前位置: 首页 > news >正文

怎么学做电商然后自己创业seo优化关键词排名

怎么学做电商然后自己创业,seo优化关键词排名,页面设计属于什么专业,合肥百度关键词排名本篇主要内容:一、应用层操作GPIO的几种方式1. 通过sysfs系统操作GPIO2. 通过/dev/mem内存映射直接操作GPIO3. 通过/dev/gpiochipx操作GPIO(linux4.8新增)4. 设备树分析二、LED子系统1.设备树添加LED节点2.应用层控制LED3.内核LED驱动一、应用…

本篇主要内容:

    • 一、应用层操作GPIO的几种方式
      • 1. 通过sysfs系统操作GPIO
      • 2. 通过/dev/mem内存映射直接操作GPIO
      • 3. 通过/dev/gpiochipx操作GPIO(linux4.8新增)
      • 4. 设备树分析
    • 二、LED子系统
      • 1.设备树添加LED节点
      • 2.应用层控制LED
      • 3.内核LED驱动

一、应用层操作GPIO的几种方式

1. 通过sysfs系统操作GPIO

📌以i.IMX6ULL为例,在前一篇移植的6.6内核,GPIO相关的引脚定义和声明均在设备树中已写好,驱动也默认使能。可以直接通过sysfs操作GPIO,在阿尔法开发板上,GPIO1_IO3接了LED,这里可以通过以下命令操作GPIO。

echo 3 > /sys/class/gpio/export		# 导出GPIO1_IO03
echo "out" > /sys/class/gpio/gpio3/direction	# 设置GPIO1_IO03为输出
echo 0 > /sys/class/gpio/gpio3/value		# GPIO1_IO03输出低电平(此时LED亮)
echo 1 > /sys/class/gpio/gpio3/value		# GPIO1_IO03输出高电平(此时LED灭)

2. 通过/dev/mem内存映射直接操作GPIO

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>// IMX6ULL GPIO1寄存器基地址
#define GPIO1_BASE 0x0209C000// GPIO寄存器偏移量
#define GPIO_DR     0x00    // 数据寄存器
#define GPIO_GDIR   0x04    // 方向寄存器
#define GPIO_PSR    0x08    // 引脚状态寄存器
#define GPIO_ICR1   0x0C    // 中断配置寄存器1
#define GPIO_ICR2   0x10    // 中断配置寄存器2
#define GPIO_IMR    0x14    // 中断屏蔽寄存器
#define GPIO_ISR    0x18    // 中断状态寄存器
#define GPIO_EDGE_SEL 0x1C // 边沿选择寄存器// 内存映射大小
#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)		//0xFFF,4K对齐用int main(int argc, char *argv[]) {if (argc != 2) {fprintf(stderr, "Usage: %s <0|1>\n", argv[0]);fprintf(stderr, "  0: set GPIO1_IO03 low\n");fprintf(stderr, "  1: set GPIO1_IO03 high\n");return -1;}int value = atoi(argv[1]);if (value != 0 && value != 1) {fprintf(stderr, "Invalid value: %s. Must be 0 or 1.\n", argv[1]);return EXIT_FAILURE;}int fd;void *map_base;volatile unsigned long *gpio_dr;volatile unsigned long *gpio_gdir;// 打开/dev/mem 设备if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) {perror("open /dev/mem");return EXIT_FAILURE;}// 对齐后的GPIO1基地址映射到用户空间map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO1_BASE & ~MAP_MASK);if (map_base == (void *)-1) {perror("mmap");close(fd);return EXIT_FAILURE;}// 计算寄存器地址off_t gpio_addr = GPIO1_BASE & MAP_MASK;	// 0x0209C000 & 0xfff得到页偏移值,这里偏移是0gpio_gdir = (volatile unsigned long *)((char *)map_base + gpio_addr + GPIO_GDIR);gpio_dr = (volatile unsigned long *)((char *)map_base + gpio_addr + GPIO_DR);// 设置 GPIO1_IO03 为输出模式 (bit3 = 1)*gpio_gdir |= (1 << 3);// 设置输出电平if (value) {*gpio_dr |= (1 << 3);  // 设置高电平printf("Set GPIO1_IO03 HIGH\n");} else {*gpio_dr &= ~(1 << 3); // 设置低电平printf("Set GPIO1_IO03 LOW\n");}// 释放内存、关闭设备if (munmap(map_base, MAP_SIZE) == -1) {perror("munmap");}close(fd);return 0;
}

在这里插入图片描述

3. 通过/dev/gpiochipx操作GPIO(linux4.8新增)

📌这种方式是linux4.8以后新增的方式,也是GPIO子系统一部分,是当前比较新和推荐的方式,毕竟sysfs在2020年被标记为deprecated(废弃),同时,也引入了libgpiod这个库供应用层来操作GPIO,以及相应的命令行测试工具。上一篇使用的根文件系统是不带gpiod相关的命令,这里重新使用buildroot制作了一个根文件系统,并添加了gpiod相关的命令。

在这里插入图片描述

📌命令操作GPIO如下(其它命令略):

root@ATK-IMX6ULL:~# gpioset /dev/gpiochip0 3=1		# 操作GPIO1_IO3输出高电平
root@ATK-IMX6ULL:~# gpioset /dev/gpiochip0 3=0		# 操作GPIO1_IO3输出低电平

📌libgpiod操作GPIO代码如下:

#include <gpiod.h>
#include <stdio.h>
#include <unistd.h>int main() {const char *chipname = "gpiochip0";struct gpiod_chip *chip;struct gpiod_line *line;int ret;// 打开GPIO控制器chip = gpiod_chip_open_by_name(chipname);if (!chip) {perror("Open chip failed");return 1;}// 获取GPIO3(IMX6ULL GPIO1_IO03 = 偏移量 3)line = gpiod_chip_get_line(chip, 3);if (!line) {perror("Get line failed");gpiod_chip_close(chip);return 1;}// 配置为输出模式,初始低电平ret = gpiod_line_request_output(line, "example", 0);if (ret < 0) {perror("Request line as output failed");goto cleanup;}// 设置高电平gpiod_line_set_value(line, 1);printf("GPIO3 has been set HIGH\n");sleep(1);// 设置低电平gpiod_line_set_value(line, 0);printf("GPIO3 has been set LOW\n");cleanup:// 释放资源gpiod_line_release(line);gpiod_chip_close(chip);return 0;
}

在这里插入图片描述

📌编译命令如图所示,需要提前交叉编译好对应的库,最后的运行结果,LED先熄灭1s后亮起

4. 设备树分析

gpio1: gpio@209c000 {		/* GPIO1_IOX基地址0x209c000 *//* 匹配该GPIO控制器兼容的驱动:*/compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";reg = <0x0209c000 0x4000>;	/* <寄存器基地址 大小16KB>*/interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,		/* <中断控制器 中断号 触发方式> */<GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;clocks = <&clks IMX6UL_CLK_GPIO1>;		/* 时钟信号 */gpio-controller;		/* gpio控制器 */#gpio-cells = <2>;		/* <&gpio1 3 0> */interrupt-controller;#interrupt-cells = <2>;	/* <引脚复用控制器 GPIO起始编号 iomux控制器起始编号 GPIO数量> *//* 0-9、10-15、16-31 一共32个GPIO */gpio-ranges = <&iomuxc  0 23 10>, <&iomuxc 10 17 6>,<&iomuxc 16 33 16>;
};

📌源码中默认已经开启了GPIO子系统,如果没有可以添加以下配置到.config

CONFIG_GPIOLIB=y //启用GPIO核心库
CONFIG_OF_GPIO=y //允许通过设备树配置GPIO
CONFIG_GPIOLIB_IRQCHIP=y //允许GPIO引脚用于中断请求
CONFIG_GPIO_CDEV=y //启用字符设备(cdev)接口来访问GPIO
CONFIG_GPIO_CDEV_V1=y //使用GPIO字符设备接口的版本V1
CONFIG_GPIO_GENERIC=y //启用通用GPIO框架,提供了标准的GPIO实现

二、LED子系统

1.设备树添加LED节点

gpio-leds {compatible = "gpio-leds";status = "okay";led0 {function = LED_FUNCTION_HEARTBEAT;color = <LED_COLOR_ID_RED>;gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;linux,default-trigger = "heartbeat";};
};

📌关于LED内核所提供的驱动配置路径如下,在设备树中添加以上节点,替换到开发板重启,可以看到LED闪烁

在这里插入图片描述

2.应用层控制LED

root@ATK-IMX6ULL:~# ls /sys/class/leds/*
mmc0::/         mmc1::/         red:heartbeat/
root@ATK-IMX6ULL:~# echo none > /sys/class/leds/red:heartbeat/trigger
root@ATK-IMX6ULL:~# echo 1 > /sys/class/leds/red:heartbeat/brightness
root@ATK-IMX6ULL:~# echo 0 > /sys/class/leds/red:heartbeat/brightness

3.内核LED驱动

📌源码路径:

📂linux-imx-lf-6.6.y/drivers/leds/led-core.c
📂linux-imx-lf-6.6.y/drivers/leds/led-class.c
📂linux-imx-lf-6.6.y/drivers/leds/leds-gpio.c
📂linux-imx-lf-6.6.y/drivers/leds/leds-pwm.c
📂linux-imx-lf-6.6.y/drivers/leds/leds.h

📌楼了一眼代码,有点小复杂看不懂,此处略过。大致的关系如下

源文件层次主要功能
led-class.c核心抽象层定义核心数据结构 struct led_classdev,通过它注册具体的LED设备
led-core.c核心基础实现层提供了LED子系统的核心实现,如sysfs 接口、全局初始化等
leds-gpio.c硬件驱动层控制GPIO引脚上的LED,实现probe函数初始化GPIO并注册LED设备
leds-pwm.c其它功能控制PWM信号驱动的LED,通过调节PWM占空比实现亮度控制
led-triggers.c其它功能实现了LED触发器功能(如 heartbeat、timer)

在这里插入图片描述

http://www.dtcms.com/a/399113.html

相关文章:

  • 360免费建站怎么进不去网站开发合同模板免费
  • 51单片机实践之数码管电子时钟/时间显示及其设置
  • 条款9:优先选用别名声明,而非typedef
  • Matlab调用GPT-5 API示例
  • 猪八戒网站做软件让你有做黑客感觉的网站
  • 毕业设计指导网站建设揭阳网站推广教程
  • 安全多方计算 联邦学习 同态加密
  • 宁波新亚建设内部网站wordpress开发文档下载
  • GWO-Transformer灰狼算法优化编码器多特征分类预测/故障诊断,Matlab实现,代码解析+运行效果一览
  • 2025 化工 PLM 市场图鉴:软件厂商技术布局与行业应用,助力企业数字化转型
  • 竞品网站分析微信网站需要备案吗
  • 大模型-LLM-large language model
  • 探索生成式纠错在构音障碍语音识别中的应用
  • SCARA 机器人轨迹运动奇异点规避方法
  • 【Linux】自动化构建--make/Makefile
  • 建设银行手机网站wordpress电台
  • 同一种激光模式 高阶模式的产生会降低基模的功率吗 能降低多少?
  • 设计模式-责任链模式详解
  • CentOS7安装mysql最简单教程
  • 垂直网站建设方案南庄建网站服务
  • 【LVS入门宝典】LVS DR模式深度解析:直接路由(DR)的高性能秘诀,MAC地址欺骗与ARP隔离
  • 自做网站视频潍坊免费网站制作
  • 代理通讯篇无外网或不可达SockS全协议规则配置C2正反向上线解决方案
  • 做网站麻烦吗网页创意与设计50例
  • 建筑公司网站需求h5个人网站代码
  • Qwen-image-edit在ComfyUI部署使用
  • 跨云镜像迁移实战:阿里云 → 腾讯云
  • 二、更新源(阿里云)(更新成阿里云后,再执行上面的系统更新)
  • 域名访问网站怎么下载书籍设计网站推荐
  • Playwright UI自动化实战速成指南