gpio-pca953x.c驱动代码分析
时间: 2023-05-27 20:06:42 浏览: 631
gpio-pca953x.c是一个GPIO驱动,用于控制PCA953x系列的GPIO扩展器。在Linux内核中,GPIO驱动的实现通常是通过向内核注册一个gpio_chip结构体,并实现一些gpio_chip操作函数来实现。而gpio-pca953x.c就是通过实现gpio_chip操作函数来控制PCA953x系列的GPIO扩展器。
下面分析gpio-pca953x.c中的一些重要函数:
1. pca953x_gpio_direction_input()
该函数用于设置GPIO方向为输入。
```c
static int pca953x_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
{
struct pca953x_chip *pc = gpiochip_get_data(chip);
int ret;
mutex_lock(&pc->lock);
pca953x_gpio_config(pc, offset, PCA953X_DIR_INPUT);
ret = pca953x_gpio_to_irq(chip, offset);
mutex_unlock(&pc->lock);
return ret;
}
```
该函数首先通过gpiochip_get_data()获取pca953x_chip结构体,然后调用pca953x_gpio_config()函数设置GPIO的方向为输入。最后调用pca953x_gpio_to_irq()函数获取GPIO的中断号。
2. pca953x_gpio_direction_output()
该函数用于设置GPIO方向为输出。
```c
static int pca953x_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value)
{
struct pca953x_chip *pc = gpiochip_get_data(chip);
int ret;
mutex_lock(&pc->lock);
pca953x_gpio_config(pc, offset, PCA953X_DIR_OUTPUT);
pca953x_gpio_set_value(chip, offset, value);
ret = pca953x_gpio_to_irq(chip, offset);
mutex_unlock(&pc->lock);
return ret;
}
```
该函数首先通过gpiochip_get_data()获取pca953x_chip结构体,然后调用pca953x_gpio_config()函数设置GPIO的方向为输出,并调用pca953x_gpio_set_value()函数设置GPIO的值。最后调用pca953x_gpio_to_irq()函数获取GPIO的中断号。
3. pca953x_gpio_get()
该函数用于获取GPIO的值。
```c
static int pca953x_gpio_get(struct gpio_chip *chip, unsigned offset)
{
struct pca953x_chip *pc = gpiochip_get_data(chip);
int ret;
mutex_lock(&pc->lock);
ret = (pca953x_gpio_read(pc) & (1 << offset)) ? 1 : 0;
mutex_unlock(&pc->lock);
return ret;
}
```
该函数首先通过gpiochip_get_data()获取pca953x_chip结构体,然后调用pca953x_gpio_read()函数读取PCA953x寄存器的值,并根据GPIO的偏移量计算出GPIO的值。
4. pca953x_gpio_set()
该函数用于设置GPIO的值。
```c
static void pca953x_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
{
struct pca953x_chip *pc = gpiochip_get_data(chip);
mutex_lock(&pc->lock);
pca953x_gpio_set_value(chip, offset, value);
mutex_unlock(&pc->lock);
}
```
该函数首先通过gpiochip_get_data()获取pca953x_chip结构体,然后调用pca953x_gpio_set_value()函数设置PCA953x寄存器的值。
阅读全文