📄 uart2_drv.c
字号:
#include <linux/slab.h>
#include <linux/init.h>
#include "ep7312_sys.h"
// ioctl 命令ID
#define UART2_GETC 1
#define UART2_PUTC 2
// 定义串口2的主设备号
#define UART2_MAJOR 62
// 设置串口2设备
static void setup_uart2(void)
{
// 设置系统寄存器和标志寄存器
*(volatile unsigned long *)0xff0014C0 = 0x00070001;
SYSCON2 = SYSCON2 | 0x0100;
}
// 通过串口2接收一个字符
static unsigned char uart2_kernel_getchar()
{
int i;
// 持续一定时间地循环查询串口2接收队列是否有数据,
// 如果有则取出数据并返回其值
for (i = 0; i < 5000; i++)
{
// 查询接收队列是否有数据
if ((COM2CONTROL & (1 << 22)) == 0)
return COM2DATA; /* 取出字符 */
}
// 没有接收到字符, 返回-1
return -1;
}
// 通过串口2发送一个字符
static int uart2_kernel_putchar(unsigned char c)
{
int i;
// 持续一定时间地循环查询串口2发送队列是否有装满,
// 如果尚未装满, 则将数据字符插入队列等待发送
for (i = 0; i < 5000; i++)
{
// 查询接收队列是否有数据
if ((COM2CONTROL & (1 << 23)) == 0)
{
COM2DATA = c; /* 将字符插入队列 */
return 0; /* 返回成功发送标记 */
}
}
// 发送失败, 返回-1
return -1;
}
// 打开串口2设备文件
static int uart2_kernel_open(struct inode * inode, struct file * file)
{
return 0;
}
// 对串口2设备文件进行读写之外的其它操作
static int uart2_kernel_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
switch (cmd)
{
// 接收一个字符
case UART2_GETC:
return uart2_kernel_getchar();
// 发送一个字符
case UART2_PUTC:
{
uart2_kernel_putchar((*(unsigned char *)arg));
break;
}
default:
printk("Unknown Uart2 command ID.\n");
}
return -1;
}
// 串口2设备文件操作结构
struct file_operations Uart2_fops = {
open: uart2_kernel_open, /* 打开设备文件 */
ioctl: uart2_kernel_ioctl, /* 设备文件的其它操作 */
};
// 初始化串口2设备
int uart2_kernel_init(void)
{
int result;
// 注册串口2设备
printk("\nRegistering Uart2 Device\t--->\t");
result = register_chrdev(UART2_MAJOR, "uart2_ep7312", &Uart2_fops);
if (result < 0)
{
printk(KERN_INFO "[FAILED: Cannot register uart2_ep7312!]\n");
return -EBUSY;
}
else
printk("[OK]\n");
printk("Initializing Uart2 Device\t--->\t");
// 设置串口2设备
setup_uart2();
printk("[OK]\n");
// 显示成功加载信息
printk("\nEP7312 Uart2 Driver installed.\n");
printk("Written by BIT200009123.\n");
return 0;
}
static void uart2_kernel_exit(void)
{
// 注销LCD设备
printk("Unregistering Uart2 Device\t--->\t");
unregister_chrdev(UART2_MAJOR, "uart2_ep7312");
printk("[OK]\n");
return;
}
module_init(uart2_kernel_init);
module_exit(uart2_kernel_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -