配置GPIO流程:
与在STM32中配置流程一样,每个步骤都有相同的对应函数
申请GPIO:gpio_request()
int gpio_request(unsigned gpio, const char *label);
gpio: 要请求的 GPIO 编号。
label: 用于描述 GPIO 资源的字符串标签。
配置GPIO方向:gpio_direction_output
(输出)、gpio_direction_input
(输入)
int gpio_direction_output(unsigned gpio, int value);
gpio: 要配置的 GPIO 号码。
value: 输出的初始值,0 表示低电平,非零值表示高电平。
int gpio_direction_input(unsigned int gpio);
读取输入状态:gpio_get_value
int gpio_get_value(unsigned int gpio);
函数返回 GPIO 的状态,0 表示低电平,非零值表示高电平。
设置输出状态:gpio_set_value
void gpio_set_value(unsigned int gpio, int value);
value:要设置的状态,0 表示低电平,非零值表示高电平。
释放 GPIO:gpio_free()
void gpio_free(unsigned int gpio);
Linux内核GPIO大体框架
下面这个代码不可以直接运行,不过大体框架是这样的。要注意的是,不能直接在open、read、write、close直接用mdelay、udelay等延时操作,否则会卡死,如果要用,则在自己写的其他函数中使用,然后在open等函数中调用
#define DEV_NAME "dht"
#define GPIO_DHT11 S3C2410_GPF(6)
static inline void dht_init(void)
{
gpio_request(GPIO_DHT11,"gpio_dht11");
gpio_direction_output(GPIO_DHT11,1);
}
static inline void dht11_deinit(void)
{
gpio_free(GPIO_DHT11);
}
void dht11_start(void)
{
gpio_direction_output(GPIO_DHT11, 1);
gpio_set_value(GPIO_DHT11, 0);
gpio_direction_input(GPIO_DHT11);
}
int wait_respond(void)
{
gpio_get_value(GPIO_DHT11)
return 0;
}
static int open(struct inode *node, struct file *file)
{
printk("kernel open \n");
return 0;
}
static ssize_t read(struct file *file, char __user *buf, size_t len, loff_t *loff)
{
dht112_init();
dht11_start();
wait_respond();
copy_to_user(buf,data,sizeof(data));
printk("kernel read \n");
return 0;
}
static ssize_t write(struct file *file, const char __user *buf, size_t len, loff_t *loff)
{
printk("kernel write \n");
return 0;
}
static int close(struct inode *node, struct file *file)
{
dht11_deinit();
printk("kernel close \n");
return 0;
}
static struct file_operations fops =
{
.owner = THIS_MODULE,
.open = open,
.read = read,
.write = write,
.release = close,
};
static struct miscdevice misc_d =
{
.minor = MISC_DYNAMIC_MINOR,
.name = DEV_NAME,
.fops = &fops
};
static int __init dht11_init(void)
{
int ret = misc_register(&misc_d);
if(ret < 0)
goto err_misc_register_failed;
printk("dht11_init ------###############################\n");
return 0;
err_misc_register_failed:
printk("misc_register failed \n");
misc_deregister(&misc_d);
return ret;
}
static void __exit dht11_exit(void)
{
misc_deregister(&misc_d);
printk("dht11_exit ... \n");
}
module_init(dht11_init);
module_exit(dht11_exit);
MODULE_LICENSE("GPL");