linux原本usart的端口怎么用为gpio呢?驱动代码
时间: 2024-03-02 10:48:33 浏览: 26
以下是将 Linux 中的 USART 端口用作 GPIO 的驱动代码示例:
```
#include <linux/module.h>
#include <linux/init.h>
#include <linux/gpio.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/uaccess.h>
#include <asm/io.h>
#define USART1_BASE 0x40013800
#define GPIOA_BASE 0x48000000
#define USART1_CR1 (USART1_BASE + 0x00)
#define USART1_CR2 (USART1_BASE + 0x04)
#define USART1_CR3 (USART1_BASE + 0x08)
#define USART1_BRR (USART1_BASE + 0x0C)
#define USART1_DR (USART1_BASE + 0x1C)
#define GPIOA_MODER (GPIOA_BASE + 0x00)
#define GPIOA_OSPEED (GPIOA_BASE + 0x08)
#define GPIOA_OTYPER (GPIOA_BASE + 0x0C)
#define GPIOA_PUPDR (GPIOA_BASE + 0x0E)
#define GPIOA_IDR (GPIOA_BASE + 0x10)
#define GPIOA_ODR (GPIOA_BASE + 0x14)
static dev_t devno;
static struct cdev cdev;
static struct class *cls;
static struct device *dev;
static int major = 0;
static int minor = 0;
static int usart_gpio_open(struct inode *inode, struct file *filp)
{
/* 禁用 USART 功能 */
writel(0, USART1_CR1);
/* 配置 GPIO 功能 */
gpio_request(GPIO14, "TX");
gpio_direction_output(GPIO14, 1);
return 0;
}
static int usart_gpio_release(struct inode *inode, struct file *filp)
{
/* 恢复 USART 功能 */
writel(1, USART1_CR1);
/* 释放 GPIO */
gpio_free(GPIO14);
return 0;
}
static ssize_t usart_gpio_write(struct file *filp, const char __user *buf,
size_t count, loff_t *f_pos)
{
int i;
char ch;
for (i = 0; i < count; i++) {
if (copy_from_user(&ch, buf + i, 1))
return -EFAULT;
/* 发送数据 */
while (!(readl(USART1_SR) & (1 << 7)));
writel(ch, USART1_DR);
}
return count;
}
static struct file_operations usart_gpio_fops = {
.owner = THIS_MODULE,
.open = usart_gpio_open,
.release = usart_gpio_release,
.write = usart_gpio_write,
};
static int __init usart_gpio_init(void)
{
int ret = 0;
/* 分配设备号 */
if (major) {
devno = MKDEV(major, minor);
ret = register_chrdev_region(devno, 1, "usart_gpio");
} else {
ret = alloc_chrdev_region(&devno, minor, 1, "usart_gpio");
major = MAJOR(devno);
}
if (ret < 0)
return ret;
/* 初始化字符设备结构体 */
cdev_init(&cdev, &usart_gpio_fops);
cdev.owner = THIS_MODULE;
/* 注册字符设备 */
ret = cdev_add(&cdev, devno, 1);
if (ret < 0) {
unregister_chrdev_region(devno, 1);
return ret;
}
/* 创建设备类 */
cls = class_create(THIS_MODULE, "usart_gpio");
if (IS_ERR(cls)) {
cdev_del(&cdev);
unregister_chrdev_region(devno, 1);
return PTR_ERR(cls);
}
/* 创建设备节点 */
dev = device_create(cls, NULL, devno, NULL, "usart_gpio");
if (IS_ERR(dev)) {
class_destroy(cls);
cdev_del(&cdev);
unregister_chrdev_region(devno, 1);
return PTR_ERR(dev);
}
return 0;
}
static void __exit usart_gpio_exit(void)
{
/* 销毁设备节点 */
device_destroy(cls, devno);
/* 销毁设备类 */
class_destroy(cls);
/* 删除字符设备 */
cdev_del(&cdev);
/* 释放设备号 */
unregister_chrdev_region(devno, 1);
}
module_init(usart_gpio_init);
module_exit(usart_gpio_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("USART GPIO Driver");
```
需要注意的是,以上示例代码仅供参考,具体实现方式可能会因硬件平台、内核版本等因素而有所不同。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)