基于TQ2440开发板与QT CREATOR,写一个Linux驱动开发程序实现利用file_operations中read函数和copy_to_user函数读取开发板gpio gpf3口的输入信号并存放在一个字符数组,再写一个qt gui测试程序实现利用read函数读取驱动内核中存放的字符数组并在其窗体上的label中显示出来,请写出实现代码
时间: 2023-03-10 19:41:18 浏览: 162
要实现上述功能,需要以下代码:1. 内核驱动程序:// 驱动文件
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/uaccess.h>// 定义设备文件名
#define DEVICE_NAME "gpio_dev"// 定义GPIO地址
#define GPF3CON 0x11000C60
#define GPF3DAT 0x11000C64// 定义设备文件结构体
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.read = dev_read,
};// 声明设备变量
static struct class *gpio_class;
static struct device *gpio_dev;// 定义字符数组
static char gpio_data[2];// 声明IO指针
static void __iomem *gpf3con;
static void __iomem *gpf3dat;// 定义read函数
static ssize_t dev_read(struct file *file, char __user *buf,
size_t count, loff_t *ppos)
{
// 读取GPIO状态
gpio_data[0] = readl(gpf3dat) & 0x1;
gpio_data[1] = '\0'; // 传递读取的数据给用户空间
copy_to_user(buf, gpio_data, 2); return 2;
}// 定义初始化函数
static int __init gpio_init(void)
{
// 申请内存
gpf3con = ioremap(GPF3CON, 4);
gpf3dat = ioremap(GPF3DAT, 4); // 注册字符设备
register_chrdev(240, DEVICE_NAME, &dev_fops); // 创建设备节点
gpio_class = class_create(THIS_MODULE, "gpio_class");
gpio_dev = device_create(gpio_class, NULL, MKDEV(240, 0), NULL, DEVICE_NAME); // 设置GPF3为输入口
writel((readl(gpf3con) & ~(0xf << (2 * 3))) | (0x0 << (2 * 3)), gpf3con); return 0;
}// 定义退出函数
static void __exit gpio_exit(void)
{
// 删除设备节点
device_destroy(gpio_class, MKDEV(240, 0));
class_destroy(gpio_class); // 卸载字符设备
unregister_chrdev(240, DEVICE_NAME); // 释放内存
iounmap(gpf3con);
iounmap(gpf3dat);
}// 注册初始化与退出函数
module_init(gpio_init);
module_exit(gpio_exit);2. Qt GUI测试程序:#include <QCoreApplication>
#include <QtGui>
#include <QFile>int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 创建窗体
QWidget window;
window.resize(200,100); // 添加Label
QLabel *label = new QLabel(&window);
label->setGeometry(QRect(10, 10, 100, 20)); // 读取驱动的字符数组
QFile file("/dev/gpio_dev");
file.open(QIODevice::ReadOnly);
QByteArray data = file.read(2);
file.close(); // 设置Label显示数组中的字符
if (data[0] == '1') {
label->setText("High");
} else {
label->setText("Low");
} window.show(); return a.exec();
}
阅读全文