msm8953 android9.0 GPIO子系统代码?
时间: 2023-07-09 09:46:50 浏览: 172
Android 9.0中的GPIO子系统是基于Linux内核的GPIO子系统进行开发的,主要由以下几个组件组成:
1. GPIO控制器驱动:用于控制GPIO控制器的初始化、配置和控制等操作。
2. GPIO子系统核心:提供了一组API用于对GPIO进行操作,如gpio_request()、gpio_direction_input()、gpio_direction_output()等。
3. GPIO用户接口:由用户空间的应用程序调用,通过sysfs文件系统与GPIO子系统交互,如/sys/class/gpio/目录下的文件。
以下是GPIO子系统的核心代码:
```
struct gpio_chip {
const char *label; // GPIO控制器的标签
struct device *parent; // GPIO控制器的设备节点
unsigned int base; // GPIO控制器的基地址
int ngpio; // GPIO控制器支持的GPIO引脚数量
int can_sleep; // GPIO控制器是否支持睡眠模式
int (*request)(struct gpio_chip *chip, unsigned int offset);
void (*free)(struct gpio_chip *chip, unsigned int offset);
int (*direction_input)(struct gpio_chip *chip, unsigned int offset);
int (*direction_output)(struct gpio_chip *chip, unsigned int offset, int value);
int (*get)(struct gpio_chip *chip, unsigned int offset);
void (*set)(struct gpio_chip *chip, unsigned int offset, int value);
int (*get_direction)(struct gpio_chip *chip, unsigned int offset);
int (*set_config)(struct gpio_chip *chip, unsigned int offset, unsigned long config);
struct gpio_irq_chip irq; // 中断控制器
};
int gpio_request(unsigned int gpio, const char *label)
{
struct gpio_chip *chip = gpio_to_chip(gpio);
int ret;
if (!chip)
return -ENODEV;
if (gpio >= chip->ngpio)
return -EINVAL;
ret = chip->request(chip, gpio);
if (!ret) {
struct gpio_desc *desc = &gpio_desc[gpio];
desc->chip = chip;
desc->offset = gpio;
desc->label = label;
desc->flags = 0;
desc->value = 0;
}
return ret;
}
int gpio_direction_input(unsigned int gpio)
{
struct gpio_chip *chip = gpio_to_chip(gpio);
if (!chip)
return -ENODEV;
if (gpio >= chip->ngpio)
return -EINVAL;
return chip->direction_input(chip, gpio);
}
int gpio_direction_output(unsigned int gpio, int value)
{
struct gpio_chip *chip = gpio_to_chip(gpio);
if (!chip)
return -ENODEV;
if (gpio >= chip->ngpio)
return -EINVAL;
return chip->direction_output(chip, gpio, value);
}
int gpio_get_value(unsigned int gpio)
{
struct gpio_chip *chip = gpio_to_chip(gpio);
if (!chip)
return -ENODEV;
if (gpio >= chip->ngpio)
return -EINVAL;
return chip->get(chip, gpio);
}
void gpio_set_value(unsigned int gpio, int value)
{
struct gpio_chip *chip = gpio_to_chip(gpio);
if (!chip)
return;
if (gpio >= chip->ngpio)
return;
chip->set(chip, gpio, value);
}
```
以上是GPIO子系统的核心代码,可以看到,GPIO子系统提供了一组API用于对GPIO进行操作,如gpio_request()、gpio_direction_input()、gpio_direction_output()等,这些API都是由GPIO控制器驱动和GPIO控制器硬件实现的。
阅读全文