⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart2_drv.c

📁 这是一个用于嵌入式用ep7312驱动源码
💻 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 + -