03_uartLinux内核模块

news2025/1/21 18:47:51

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.coloradmin.cn/o/1454883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术再被认可,Smartbi荣获“2023大数据产业年度创新技术突破”奖

近日&#xff0c;由金猿、数据猿、上海大数据联盟主办&#xff0c;上海市经济和信息化委员会、上海科学技术委员会指导的“第六届金猿季&魔方论坛——大数据产业发展论坛”在上海举行。 思迈特软件凭借“基于数据模型的自然语言数据查询系统“荣获“2023大数据产业年度创新…

MATLAB | 绘图复刻(十五) | 环形聚类树状图

本期复刻效果&#xff1a; 感觉出的聚类分析树状图绘制工具也不少了&#xff0c;未来可能会统一整理为一个工具包&#xff1f;(任重道远&#xff0c;道阻且长)&#xff1a; 代码讲解 0 数据设置 写了比较多的注释应该比较易懂&#xff1a; clc; clear; close all% 样品起名s…

2024年【安全员-C证】报名考试及安全员-C证考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证报名考试参考答案及安全员-C证考试试题解析是安全生产模拟考试一点通题库老师及安全员-C证操作证已考过的学员汇总&#xff0c;相对有效帮助安全员-C证考试资料学员顺利通过考试。 1、【多选题】《工伤保险…

吴恩达机器学习全课程笔记第二篇

目录 前言 P31-P33 logistics &#xff08;逻辑&#xff09;回归 决策边界 P34-P36 逻辑回归的代价函数 梯度下降的实现 P37-P41 过拟合问题 正则化代价函数 正则化线性回归 正则化logistics回归 前言 这是吴恩达机器学习笔记的第二篇&#xff0c;第一篇笔记请见&…

SSH密钥认证登陆流程(Vscode连接到远程)

目录 前言连接远程步骤1. 下载工具包wsCli到本地机器2. 本地机器上生成ssh密钥3. 在服务器上安装公钥4. vscode连接到远程 参考资料 前言 SSH&#xff08;Secure Shell&#xff09;是一种用于远程登录和安全传输数据的网络协议。它提供了两种主要的远程连接方式&#xff1a; 密…

字符设备驱动分步注册实现LED驱动的编写

头文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t;#define RCC 0x50000A28 #define LED1_ADDR 0x50006000 #defi…

Unity求物体关于平面镜像对称后坐标以及旋转

前言&#xff1a;如题&#xff0c;我在已知一个平面L和物体A&#xff0c;我希望得到镜像后的物体B的位置和旋转。 效果&#xff1a; 推导&#xff1a; 首先我们需要知道物体的对称坐标A&#xff0c;我们现在能已知A坐标以及平面L的法线&#xff0c;如果我们能得到B的坐标&…

芯品荟|吉他屏驱应用介绍

PART ONE 市场简介 - Market Profile - 古典吉他与小提琴、钢琴并列为世界著名三大乐器。 目前&#xff0c;带屏成为吉他产品的新发展趋势。 核心应用 调音器、节拍器、录音器、效果、练习、循环乐段。 特色应用 4.3寸以下TFT屏 分辨率800*480以下 不带音弦按键替代&…

java项目的构建流程

1.创建项目 2.创建模块 创建时要注意组ID的命名 通常包含以下模块: 项目的pom文件中,依赖如下(web模块不需要依赖,也不需要main文件夹): 3.配置pom文件 1),主pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mav…

2.18通过字符设备驱动分步注册过程实现LED驱动的编写,编写应用程序测试

应用程序&#xff1a; #include<stdlib.h> #include<stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<unistd.h> #include<string.h> #include<sys/ioctl.h> #include"myled.h&quo…

ubuntu22.04-磁盘管理-虚拟机动态扩容-系统monitor

文章目录 1.虚拟机2.ubuntu设置3.命令查看4.系统资源管理器1.虚拟机 关闭ubuntu22.04,然后修改虚拟机设置,如下图所示: 修改容量 2.ubuntu设置 搜索打开disks,如下图所示: 选择目标磁盘,选择调整大小到目标大小即可。

vmware-17虚拟机安装教程及版本密钥(保姆级,包含图文讲解,不需注册账户)

文章目录 vmware安装教程一、下载vmware二、安装三、破解密匙 vmware安装教程 一、下载vmware 1.进入VMware官网&#xff1a;https://www.vmware.com/sg/products/workstation-pro.html 2.向下翻找到&#xff0c;如下界面并点击“现在安装” 3.稍事等待以下直到出现以下界面…

医疗器械企业融资排行榜,敷尔佳、心脉医疗、安杰思医学、西山科技、康诺思腾融资总额超70亿元!

21世纪以来&#xff0c;中国医疗器械市场经历多年高速增长&#xff0c;产业集聚度、全球化发展进程不断提升&#xff0c;医疗器械行业竞争加剧。对于医疗器械新兴企业而言&#xff0c;获得融资不仅是支持其技术创新和产品研发生产的重要资金来源&#xff0c;更是推动企业扩张发…

怎么恢复电脑重装前的数据?介绍几种有效的方法

在日常生活和工作中&#xff0c;电脑已成为我们不可或缺的工具。然而&#xff0c;有时候我们会遇到一些突发情况&#xff0c;比如电脑系统崩溃需要重新安装系统。在这个过程中&#xff0c;我们可能会失去一些重要的数据&#xff0c;比如照片、文档、视频等。这些数据可能包含着…

YOLOv8改进 | Conv篇 | 利用FasterBlock二次创新C2f提出一种全新的结构(全网独家首发,参数量下降70W)

一、本文介绍 本文给大家带来的改进机制是利用FasterNet的FasterBlock改进特征提取网络,将其用来改进ResNet网络,其旨在提高计算速度而不牺牲准确性,特别是在视觉任务中。它通过一种称为部分卷积(PConv)的新技术来减少冗余计算和内存访问。这种方法使得FasterNet在多种设…

速看!2024年泰国国际电力能源展10月16-18日

2024年泰国&#xff08;亚洲&#xff09;国际电力能源展暨电工技术设备展 展会时间&#xff1a;2024年10月16-18日 展会地点&#xff1a;泰国.曼谷BITEC会展中心 主办单位&#xff1a;新加坡Fireworks展览集团 组织单位&#xff1a;武汉柏翰展览有限公司(Fireworks China) …

vue框架-vue-cli

vue-cli Vue CLI是一个官方的脚手架工具,用于快速搭建基于Vue.js的项目。Vue CLI提供了一整套可配置的脚手架,可以帮助开发人员快速构建现代化的Web应用程序。 Vue CLI通过提供预先配置好的Webpack模板和插件,使得开发人员可以在不需要手动编写Webpack配置的情况下快速创建…

15.一种坍缩式的简单——组合模式详解

当曾经的孩子们慢慢步入社会才知道&#xff0c;那年味渐淡的春节就像是疾驰在人生路上的暂停键。 它允许你在隆隆的鞭炮声中静下心来&#xff0c;瞻前顾后&#xff0c;怅然若失。 也允许你在寂静的街道上屏气凝神&#xff0c;倾听自己胸腔里的那团人声鼎沸。 孩子们会明白的&am…

信息安全认证 | CISP证书怎么样?值得考吗?

HCIE考证研究所的朋友们&#xff0c;新年快乐&#xff01; 今天给大家说说CISP证书&#xff0c;新的一年祝大家逢考必过啊~ 01 考注册信息安全工程师证书的用处 CISP证书可作为学识和技能证明&#xff1b;求职、任职、晋升、加薪的资格凭证&#xff1b;用人单位招聘、录用劳动…

论文精读--对比学习论文综述

InstDisc 提出了个体判别任务&#xff0c;而且利用这个代理任务与NCE Loss去做对比学习从而得到了不错的无监督表征学习的结果&#xff1b;同时提出了别的数据结构——Memory Bank来存储大量负样本&#xff1b;解决如何对特征进行动量式的更新 翻译&#xff1a; 有监督学习的…