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.hqwc.cn/news/475385.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

驶向未来:3D可视化模型重塑我们的道路认知

在科技的浪潮中&#xff0c;每一个革新都是对人类未来生活的深度洞察。而今&#xff0c;当可视化这一技术走进我们的视野&#xff0c;它不仅是一场视觉盛宴&#xff0c;更是一次对未来出行方式的全新探索。 一、从平面到立体&#xff0c;解锁道路新视角 你是否曾站在十字路口&…

两宋319年,37位诗词达人编年史

公元960年后周禁军将领赵匡胤通过陈桥兵变夺取帝位&#xff0c;定都开封府&#xff0c;建立宋朝。 1 李煜 生于公元937年&#xff0c;宋灭南唐千古词帝李煜深陷牢狱。3年之后的七夕之夜赐药身亡&#xff0c;临死前留有《虞美人》 “问君能有几多愁&#xff0c;恰似一江春水向…

基于stm32单片机智能储物柜系统设计

超市、体育馆及浴池等公共超市都为人们提供了储物柜&#xff0c;一些无法随身携带的书包、手机等物品可存放在储物柜中。当前绝大多数的储物柜都是采用打印条码的方式完成储物柜的开启&#xff0c;之后可使用打印条码经扫描后开启储物柜拿取个人物品。但是打印条码的纸张为又小…

5、Linux 常用指令

一、帮助指令 1.man 指令 语法 man [命令或配置文件] //功能描述&#xff1a;获得帮助手册上的信息查看 ls 命令的帮助信息 man ls信息作用NAME命令名称SYNOPSIS如何使用命令DESCRIPTION描述命令SEE ALSO相关的手册 2.help 指令 语法 help [命令] //功能描述&#xff1a;获得…

什么是自动化测试?如何做自动化测试?

前面介绍了功能测试和接口测试&#xff0c;在介绍接口测试时提到了实现API自动化。那具体什么是自动化&#xff0c;为什么要做自动化&#xff0c;这里我们集中总结。 一. 什么是自动化&#xff1f; 顾名思义&#xff0c;自动化测试是相对人工测试而言的&#xff0c;它是指把人…

MT8781核心板_MTK8781安卓核心板规格参数

MT8781安卓核心板以其强大的性能和高效的能耐备受瞩目。其八核CPU架构包括(2x Cortex-A76 2.2GHz 6x Cortex-A55 2.0GHz)&#xff0c;以及高性能的Arm Mali G57级GPU。同时&#xff0c;配备高达2,133MHz的LPDDR4X内存和快速的UFS 2.2级存储&#xff0c;大大加速了数据访问速…

【Vue前端】vue使用笔记0基础到高手第2篇:Vue知识点介绍(附代码,已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论vue相关知识。Vue.js是前端三大新框架&#xff1a;Angular.js、React.js、Vue.js之一&#xff0c;Vue.js目前的使用和关注程度在三大框架中稍微胜出&#xff0c;并且它的热度还在递增。Vue.js是一个轻巧、高性能、可组件…

C语言—指针

碎碎念:做指针题的时候我仿佛回到了原点&#xff0c;总觉得目的是为了把框架搭建起来&#xff0c;我胡说的哈31 1.利用指针变量将一个数组中的数据反向输出。 /*1.利用指针变量将一个数组中的数据反向输出。*/#include <stdio.h> #include <time.h> #include <…

开源软件:推动软件行业繁荣的力量

文章目录 &#x1f4d1;引言开源软件的优势分析开放性与透明度低成本与灵活性创新与协作 开源软件对软件行业的影响推动技术创新和进步促进软件行业的合作与交流培养人才和提高技能促进软件行业的可持续发展 结语 &#x1f4d1;引言 随着信息技术的飞速发展&#xff0c;软件已经…

NVIDIA Chat with RTX

NVIDIA在2月13日发布了Chat With RTX&#xff0c;这是一款类似于ChatGPT的免费个性化 AI 聊天机器人&#xff0c;可以在配备 Nvidia RTX 显卡的 PC 上本地运行。它使用Mistral或Llama开放权重LLM&#xff0c;可以搜索本地文件并回答有关它们的问题。本文中我们一起来了解一下Ch…

【OpenAI Sora】 最强文生视频怎么用-新手小白必看教程

1. Sora 是什么AI 2024年2月16日&#xff0c;OpenAI在其官网上面正式宣布推出文本生成视频的大模型 Sora。 Sora能够根据简单的文本描述&#xff0c;生成高达60秒的高质量视频&#xff0c;使得视频创作变得前所未有的简单和高效。本文将为您提供关于如何使用Sora的最新详细教程…

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

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