03_uartLinux内核模块

01_basicLinux内核模块-CSDN博客文章浏览阅读23次。环境ID=ubuntuMakefilemodules:clean:basic.creturn 0;运行效果。https://blog.csdn.net/m0_37132481/article/details/136157384?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136157384%22%2C%22source%22%3A%22m0_37132481%22%7Duart.c

root@T:/media/sf_D_DRIVE/kmodule/03_uart# cat uart.c
#include <linux/module.h>
#include <linux/tty.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/console.h>
#include <linux/device.h>
#include <linux/tty_flip.h>
#include <linux/serial_core.h>
#include <linux/serial.h>
#include <linux/io.h>

#define TAG "HELLO# "

static void my_uart_stop_tx(struct uart_port *port)
{
        printk(TAG "%s\n", __func__);
}
static void echo_putchar(struct uart_port *port, u8 ch)
{
        /* write char output */
        printk("%c", ch);
        /* read char input */
        uart_insert_char(port, 0, 0, ch, 0);
        tty_flip_buffer_push(&port->state->port);
}
static void my_uart_start_tx(struct uart_port *port)
{
        printk(TAG "%s\n", __func__);
        u8 ch;
        u8 tx_ready = 1;

        uart_port_tx(port, ch, tx_ready, echo_putchar(port, ch));
}
static void my_uart_stop_rx(struct uart_port *port)
{
        printk(TAG "%s\n", __func__);
}

static unsigned int my_uart_tx_empty(struct uart_port *port)
{
        printk(TAG "%s\n", __func__);
        return 0;
}

/* no modem control lines */
static unsigned int my_uart_get_mctrl(struct uart_port *port)
{
        printk(TAG "%s\n", __func__);
        return TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
}

static void my_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
{
        printk(TAG "%s\n", __func__);
}

static void my_uart_break_ctl(struct uart_port *port, int break_state)
{
        printk(TAG "%s\n", __func__);
}

static int my_uart_startup(struct uart_port *port)
{
        int ret = 0;
        printk(TAG "%s\n", __func__);
        return ret;
}

static void my_uart_shutdown(struct uart_port *port)
{
        printk(TAG "%s\n", __func__);
}

static void my_uart_set_termios(struct uart_port *port, struct ktermios *termios, const struct ktermios *old)
{
        printk(TAG "%s\n", __func__);
}

static const char *my_uart_type(struct uart_port *port)
{
        printk(TAG "%s\n", __func__);
        return port->type == PORT_21285 ? "my_uart_type" : NULL;
}

static void my_uart_release_port(struct uart_port *port)
{
        printk(TAG "%s\n", __func__);
}

static int my_uart_request_port(struct uart_port *port)
{
        printk(TAG "%s\n", __func__);
        return 0;
}

static void my_uart_config_port(struct uart_port *port, int flags)
{
        printk(TAG "%s\n", __func__);
        if (flags & UART_CONFIG_TYPE)
                port->type = PORT_21285;
}

/*
 * verify the new serial_struct (for TIOCSSERIAL).
 */
static int my_uart_verify_port(struct uart_port *port, struct serial_struct *ser)
{
        printk(TAG "%s\n", __func__);
        int ret = 0;
        return ret;
}

static const struct uart_ops my_uart_ops = {
        .tx_empty       = my_uart_tx_empty,
        .get_mctrl      = my_uart_get_mctrl,
        .set_mctrl      = my_uart_set_mctrl,
        .stop_tx        = my_uart_stop_tx,
        .start_tx       = my_uart_start_tx,
        .stop_rx        = my_uart_stop_rx,
        .break_ctl      = my_uart_break_ctl,
        .startup        = my_uart_startup,
        .shutdown       = my_uart_shutdown,
        .set_termios    = my_uart_set_termios,
        .type           = my_uart_type,
        .release_port   = my_uart_release_port,
        .request_port   = my_uart_request_port,
        .config_port    = my_uart_config_port,
        .verify_port    = my_uart_verify_port,
};

static struct uart_port my_uart_port = {
        .mapbase        = 0xaabbccdd,
        .iotype         = UPIO_MEM,
        .irq            = 0,
        .fifosize       = 16,
        .ops            = &my_uart_ops,
        .flags          = UPF_BOOT_AUTOCONF,
};

static struct uart_driver my_uart_reg = {
        .owner                  = THIS_MODULE,
        .driver_name            = "my_uart_driver",
        .dev_name               = "ttyMyUart",
        .major                  = 204,
        .minor                  = 4,
        .nr                     = 1,
};

static int __init my_uart_init(void)
{
        int ret;

        my_uart_port.dev = kzalloc(sizeof(*my_uart_port.dev), GFP_KERNEL);
        dev_set_name(my_uart_port.dev, "%s", "my_uart_device");
        ret = device_register(my_uart_port.dev);
        my_uart_port.dev = get_device(my_uart_port.dev);

        ret = uart_register_driver(&my_uart_reg);
        if (ret == 0)
                ret = uart_add_one_port(&my_uart_reg, &my_uart_port);

        printk("ret=%d\n", ret);
        return ret;
}

static void __exit my_uart_exit(void)
{
        uart_remove_one_port(&my_uart_reg, &my_uart_port);
        uart_unregister_driver(&my_uart_reg);

        device_unregister(my_uart_port.dev);
        kfree(my_uart_port.dev);
}

module_init(my_uart_init);
module_exit(my_uart_exit);

MODULE_LICENSE("GPL");

效果

 root@T:/media/sf_D_DRIVE/kmodule/03_uart# ls /dev/ttyMyUart0
/dev/ttyMyUart0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/394208.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

禁止电子邮箱地址登录WordPress后台的插件No Login by Email Address

WordPress 4.5及之后的版本增加了使用注册用户的电子邮件地址代替用户名登录的功能&#xff0c;但是大多数个人站长的管理员邮箱地址都是固定&#xff0c;而且到其他站点进行评论留言也是同一个邮箱地址&#xff0c;很容易给一些别有用心的可乘之机&#xff0c;所以禁止WordPre…

备战蓝桥杯---数学之矩阵快速幂基础

我们先不妨看一道题&#xff1a; 看见n的数据范围就知道直接按以前的递归写肯定狗带&#xff0c;那我们有什么其他的方法吗&#xff1f; 下面是分析&#xff1a; 我们就拿斐波那契数列试试手吧&#xff1a; 下面是AC代码&#xff0c;可以当作模板记&#xff1a; #include<b…

二叉树(5)——链式二叉树

续上篇&#xff0c;我们继续讲解链式二叉树第K层的节点个数和查找值为x的节点的代码实现。 1 二叉树第K层的节点个数 思路分析 若为空&#xff0c;返回0不为空&#xff0c;且k1&#xff0c;返回1不为空&#xff0c;且k>1&#xff0c;返回左子树的k-1层右子树的k-1层 代码实…

十大经典排序算法之一--------------堆排序(java详解)

一.堆排序基本介绍&#xff1a; 堆排序是利用堆这种数据结构而设计的一种排序算法&#xff0c;堆排序是一种选择排序&#xff0c;它的最坏&#xff0c;最好&#xff0c;平均时间复杂度均为O(nlogn)&#xff0c;它也是不稳定排序。堆是具有以下性质的完全二叉树&#xff1a;每个…

深度学习-分类任务---经典网络

文章目录 经典网络1 LeNet51.1 模型结构1.2 模型结构1.3 模型特性 2 AlexNet2.1 模型介绍2.2 模型结构2.3 模型解读2.4 模型特性 3 可视化ZFNet-转置卷积3.1 基本的思想及其过程3.2 卷积与转置卷积3.3 卷积可视化3.4 ZFNet和AlexNet比较 4 VGGNet4.1 模型结构4.2 模型特点 5 Ne…

MySQL数据库基础(九):SQL约束

文章目录 SQL约束 一、主键约束 二、非空约束 三、唯一约束 四、默认值约束 五、外键约束&#xff08;了解&#xff09; 六、总结 SQL约束 一、主键约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含 NULL 值。每个表都应该有…

全国今日油价一键查询API:轻松了解油价新闻

导语&#xff1a; 随着能源需求的增长&#xff0c;油价成为全球经济的重要指标之一。了解油价的动态变化对于企业和个人来说都至关重要。本文介绍了一款全国今日油价一键查询的API接口&#xff0c;通过该接口可以轻松获取全国各省汽油和柴油的最新价格&#xff0c;并结合油价新…

【linux网络的综合应用】补充网关服务器搭建,综合应用SNAT、DNAT转换,dhcp分配、dns分离解析,nfs网络共享以及ssh免密登录

实验拓朴图&#xff1a; 1&#xff09;网关服务器&#xff1a;ens36&#xff1a;12.0.0.254/24&#xff0c;ens33&#xff1a;192.168.100.254/24&#xff1b;Server1&#xff1a;192.168.100.101/24&#xff1b;PC1和server2&#xff1a;自动获取IP&#xff1b;交换机无需配置…

Prometheus安装

一、Prometheus的简介 Prometheus是一种开源的监控和警报工具&#xff0c;用于收集、存储和查询各种系统和服务的指标数据。它具有灵活的查询语言和强大的可视化功能&#xff0c;可用于实时监控应用程序性能和状态。 二、Prometheus下载 1、官网下载地址 下载Prometheus 2、P…

蓝队应急响应工具箱v2024.1​

1 蓝队工具箱 v2024.1 2 简介 蓝队工具箱是为打造一款专业级应急响应的集成多种工具的工具集&#xff0c;由真实应急响应环境所用到的工具进行总结打包而来&#xff0c;由 ChinaRan404,W 啥都学,清辉等开发者编写.把项目现场中所用到的工具连同环境一同打包&#xff0c;并实…

Spring Boot 笔记 023 注册页面

1.1 request.js请求工具 //定制请求的实例//导入axios npm install axios import axios from axios; //定义一个变量,记录公共的前缀 , baseURL const baseURL /api; const instance axios.create({baseURL})//添加响应拦截器 instance.interceptors.response.use(result…

机器学习入门--双向长短期记忆神经网络(BiLSTM)原理与实践

双向长短记忆网络&#xff08;BiLSTM&#xff09; BiLSTM&#xff08;双向长短时记忆网络&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;它能够处理序列数据并保持长期记忆。与传统的RNN模型不同的是&#xff0c;BiLSTM同时考虑了过去和未来的…

[Flink02] Flink架构和原理

这是继第一节之后的Flink入门系列的第二篇&#xff0c;本篇主要内容是是&#xff1a;了解Flink运行模式、Flink调度原理、Flink分区、Flink安装。 1、运行模式 Flink有多种运行模式&#xff0c;可以运行在一台机器上&#xff0c;称为本地&#xff08;单机&#xff09;模式&am…

图像识别之ResNet(结构详解以及代码实现)

前言 在人工智能的浪潮中&#xff0c;深度学习已经成为了推动计算机视觉、自然语言处理等领域突破的关键技术。在这众多技术中&#xff0c;ResNet&#xff08;残差网络&#xff09;无疑是一个闪耀的名字。自从2015年Kaiming He等人提出ResNet架构以来&#xff0c;它不仅在图像…

【二十八】springboot整合logback实现日志管理

本章节是记录logback在springboot项目中的简单使用&#xff0c;本文将会演示如何通过logback将日志记录到日志文件或输出到控制台等管理操作。将会从以下几个方面进行讲解。最后实现将特定级别的特定日志保存到日志文件。 一、依赖 <dependency><groupId>ch.qos.l…

BMS再进阶(新能源汽车电池管理系统)

引言 一文入门BMS&#xff08;电池管理系统&#xff09;_bms电池管理-CSDN博客 BMS进阶&#xff08;Type-C、PD快充、充电IC、SOC算法、电池管理IC&#xff09;_充电ic asi aso功能-CSDN博客 本文是上面两篇博客的续篇&#xff0c;之前都是讲解一些BMS基本原理&#xff0c;…

目前2024年4核8G云服务器租用价格,阿里云PK腾讯云

4核8G云服务器多少钱一年&#xff1f;阿里云ECS服务器u1价格955.58元一年&#xff0c;腾讯云轻量4核8G12M带宽价格是646元15个月&#xff0c;阿腾云atengyun.com整理4核8G云服务器价格表&#xff0c;包括一年费用和1个月收费明细&#xff1a; 云服务器4核8G配置收费价格 阿里…

[Flink03] Flink安装

本文介绍Flink的安装步骤&#xff0c;主要是Flink的独立部署模式&#xff0c;它不依赖其他平台。文中内容分为4块&#xff1a;前置准备、Flink本地模式搭建、Flink Standalone搭建、Flink Standalong HA搭建。 演示使用的Flink版本是1.15.4&#xff0c;官方文档地址&#xff1…

PyCharm 调试过程中控制台 (Console) 窗口内运行命令 - 实时获取中间状态

PyCharm 调试过程中控制台 [Console] 窗口内运行命令 - 实时获取中间状态 1. yongqiang.py2. Debugger -> Console3. Show Python PromptReferences 1. yongqiang.py #!/usr/bin/env python # -*- coding: utf-8 -*- # yongqiang chengfrom __future__ import absolute_imp…

边坡位移监测设备:守护工程安全的前沿科技

随着现代工程建设的飞速发展&#xff0c;边坡位移监测作为预防山体滑坡、泥石流等自然灾害的重要手段&#xff0c;日益受到人们的关注。边坡位移监测设备作为这一领域的关键技术&#xff0c;以其高精度、实时监测的特点&#xff0c;成为守护工程安全的重要武器。 一、边坡位移…
最新文章