Pinctrl 子系统
GPIO 子系统
层次结构
- 引脚配置
首先: 通过 Pinctrl 子系统配置引脚的功能, 例如。 将某个引脚设置为 GPIO 功能, 。 - 状态管理
然后: GPIO 子系统使用这些配置来管理引脚的电平状态, 读取或设置引脚电平( ) 。
Pinctrl 子系统
GPIO 子系统
层次结构
背景
在早期的嵌入设备和计算机系统中
思想
技术细节
例子
// LED抽象类
class LED {
public:
virtual void turnOn() = 0;
virtual void turnOff() = 0;
};
// GPIO LED 实现
class GPIO_LED : public LED {
private:
int pin;
public:
GPIO_LED(int gpioPin) : pin(gpioPin) {}
void turnOn() override {
// GPIO设置为高电平
}
void turnOff() override {
// GPIO设置为低电平
}
};
随着硬件设备的复杂性增加
通过这种模型
思想
技术细节
struct platform_device
和 struct platform_driver
是关键数据结构// 定义平台设备的结构
struct platform_device {
// 设备的名称<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>用于匹配驱动
const char *name;
int id;
bool id_auto;
struct device dev;
u32 num_resources;
// 指向资源数组的指针<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>资源包括内存区域<span class="bd-box"><h-char class="bd bd-beg"><h-inner>、</h-inner></h-char></span>IRQ等
struct resource *resource;
/* 其他字段省略 */
};
// 定义平台驱动的结构
struct platform_driver {
// 探测函数<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>当设备被发现时调用<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>负责初始化设备
int (*probe)(struct platform_device *);
// 移除设备时调用<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>用于清理资源
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*resume)(struct platform_device *);
// 内嵌的通用设备驱动结构<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>包含了驱动信息如驱动名称<span class="bd-box"><h-char class="bd bd-beg"><h-inner>、</h-inner></h-char></span>所有者等
struct device_driver driver;
const struct platform_device_id *id_table;
/* 其他字段省略 */
};
例子
static struct platform_device led_device = {
.name = "led",
.id = -1,
.dev = {
.platform_data = &gpio_pin_number, // 假设这个GPIO引脚号作为平台数据
},
};
static struct platform_driver led_driver = {
.probe = led_probe,
.remove = led_remove,
.driver = {
.name = "led",
.owner = THIS_MODULE,
},
};
static int led_probe(struct platform_device *pdev)
{
// 获取设备的GPIO引脚信息并初始化LED
return 0;
}
static int led_remove(struct platform_device *pdev)
{
// 清理LED相关的资源
return 0;
}
技术细节
led_probe
函数在匹配成功后初始化LEDled_remove
函数在设备卸载时清理资源平台设备与驱动的匹配过程大致如下
设备注册
struct platform_device
platform_bus
驱动注册
struct platform_driver
设备树解析
匹配尝试
compatible
属性与驱动的of_match_table
是否匹配成功匹配
probe
方法probe
方法将接收到匹配的struct device
struct platform_device
资源分配
probe
方法中设备绑定
probe
方法成功失败处理
probe
方法失败背景
随着SoC
思想
技术细节
例子
/ {
leds {
compatible = "gpio-led";
gpios = <&gpio 17 GPIO_ACTIVE_HIGH>; // 假设LED连接到GPIO17
label = "led";
};
};
static int led_probe(struct platform_device *pdev)
{
struct device_node *node = pdev->dev.of_node;
int gpio;
if (of_property_read_u32(node, "gpios", &gpio))
return -ENODEV;
// 使用GPIO进行LED操作
return 0;
}
设备树描述了硬件配置
进化意义
这个过程展示了操作系统在面对越来越复杂的硬件环境时
在国内使用一些依赖包管理工具时
国内常用的 npm 镜像源是 淘宝镜像
npm config set registry https://registry.npmmirror.com
npm config get registry
# 如果输出 https://registry.npmmirror.com<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>说明设置成功<span class="bd-box"><h-char class="bd bd-beg"><h-inner>。</h-inner></h-char></span>
npm install --registry=https://registry.npmmirror.com
Yarn 同样可以直接使用淘宝镜像源
yarn config set registry https://registry.npmmirror.com
yarn config get registry
# 输出 https://registry.npmmirror.com 表示设置成功<span class="bd-box"><h-char class="bd bd-beg"><h-inner>。</h-inner></h-char></span>
yarn add package-name --registry=https://registry.npmmirror.com
Python 的包管理工具 pip
可以通过指定国内的镜像源来加速下载
pip install package-name -i https://pypi.douban.com/simple
在用户目录下创建或修改 pip
配置文件
C:\Users\你的用户名\pip\pip.ini
~/.pip/pip.conf
然后添加以下内容
[global]
index-url = https://pypi.douban.com/simple
Conda 是 Anaconda 的包管理工具
conda install package-name -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
Composer 是 PHP 的包管理工具
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer config -g --unset repos.packagist
Ruby 的包管理工具 gem
可以使用淘宝镜像
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
gem sources -l
Maven 是 Java 的包管理工具settings.xml
文件来使用国内镜像
settings.xml
在 ~/.m2/settings.xml
中添加以下内容
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
<layout>default</layout>
</mirror>
</mirrors>
对于 Android 开发者
build.gradle
文件allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google' }
}
}
如果你需要安装 Node.js 本身
nvm install node --registry=https://registry.npmmirror.com
Docker 在国内下载镜像时可能会遇到速度缓慢的问题
在 /etc/docker/daemon.json
中添加以下内容
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://mirror.ccs.tencentyun.com"
]
}
然后重启 Docker
sudo systemctl restart docker
apt
是 Ubuntu 和 Debian 系统常用的包管理工具
先备份 /etc/apt/sources.list
文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sources.list
使用文本编辑器打开 sources.list
文件
sudo nano /etc/apt/sources.list
你可以选择以下任意一个国内镜像源来替换原有的源
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
注意focal
是 Ubuntu 20.04 的代号focal
替换为对应版本的代号
保存并退出编辑器后
sudo apt update
通过切换国内镜像源
npm config set registry https://registry.npmmirror.com
yarn config set registry https://registry.npmmirror.com
pip install package-name -i https://pypi.douban.com/simple
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
~/.m2/settings.xml
build.gradle
nvm install node --registry=https://registry.npmmirror.com
在开发过程中
这种体验真的让人心累
这就像你走进了一家图书馆
话是说回来
通过切换到国内镜像源