005——串口移植(基于鸿蒙liteos-a)

目录

一、 Liteos-a中串口的使用

1.1 内核里打印

1.2 APP控制台

​编辑

1.2.1 /dev/console

1.2.2 /dev/serial

1.2.3 /dev/uartddev-0

1. 总体介绍

2. device_t

3. drvier_t

4. uartdev_fops

1.2.4 uart_ops

二、 鸿蒙串口内部的一些机制(流水账,新人可跳过)

三、串口移植

3.1 串口发送单个字符

3.2 在device_t中指定资源

3.3 实现uart_ops

3.4 GIC

四、启动后测试


一、 Liteos-a中串口的使用

1.1 内核里打印

内核打印函数是PRINT_RELEASE,它的内部调用关系如下:

PRINT_RELEASELOS_LkPrintg_osLkHookOsLkDefaultFuncOsVprintfUartPutsUartPutsRegUartPutStrUartPutcReg

我们要实现UartPutcReg,用来输出单个字符。

(vscode的自动跳转太垃了,代码量大就失效了,这个图就不给大家截了。)

1.2 APP控制台

        我们编写的应用程序,调用printf时,那些信息从哪里打印出来?从控制台。 在串口上运行程序,控制台就是串口。 远程登录板子后运行程序,控制台就是远程登录终端。

控制台的实现分为4层:

        据老师所讲鸿蒙对每个文件都有个inode节点,里面有个 file_operation_vfs结构体。以open函数为例,最上层console会调用inode中的open,open会向下调用inode一层层最后到实际的uart设备inode的open。从而实现了设备分层。

代码系统初始化中就对console去做了初始化,有点类似于linux的bash

1.2.1 /dev/console

        init进程打开的就是/dev/console,它会打开shell。 我们在shell里执行各种APP时,这些APP会继承父进程的3个设备:标准输入、标准输出、标准错误,都对应/dev/console。 我们编写的APP,一般不需要自己去打开/dev/console,它已经继承得到了。 在串口上运行程序,/dev/console就是串口。 远程登录板子后运行程序,/dev/console就是远程登录终端。 所以/dev/console表示的是当前终端,它可能对应不同的设备,比如/dev/serial/dev/telnet

1.2.2 /dev/serial

        在Liteos-a中,/dev/serial被称为virtual serial,虚拟串口。它只是起一个中转的作用,无论是APP还是内核,使用/dev/serial时,都是再次跳转去执行具体串口设备驱动程序的函数。比如:

        那么,/dev/serial这个虚拟串口,怎么跟具体串口挂钩?也就是上图中,GetFileOps函数为何能得到具体串口的驱动程序? 方法如下图所示:

virtual_serial_init函数会找到/dev/uartdev-0的驱动程序(即它对应的struct inode,里面含有file_operations_vfs)。

1.2.3 /dev/uartddev-0

1. 总体介绍

这是真正操作硬件的驱动程序,它分为两部分:device_tdriver_t

  • device_t中设置资源,比如寄存器物理基地址、中断号等

  • driver_t中提供函数,比如device_probedevice_attach函数

    • 当内核发现有名字系统的device_tdriver_t

    • 就会调用driver_t中的device_probedevice_attach函数

    • 在里面根据device_t得到资源、注册驱动register_driver

这种写驱动程序的方法,被称为分离:操作函数、资源分离。 以后想换一个硬件,只需要修改device_t就可以,driver_t保存不变。

2. device_t

示例代码:

3. drvier_t

先注册一个drvier_t结构体,它里面带有各类device_method_t

当内核发现有同名的device_tdriver_t时,就会调用driver_t里面提供的device_probedevice_attach函数。

4. uartdev_fops

device_attach函数里从device_t里获取硬件资源、注册驱动:

/dev/uartdev-0对应的驱动程序时uartdev_fops,它通过uart_ops来操作硬件。

1.2.4 uart_ops

在UART驱动程序里,我们只需要提供硬件操作部分:

uart_ops里有4个函数:

  • config:配置串口,比如波特率等

  • startup:启动串口,比如注册中断处理函数、启动串口

  • start_tx:发送字符串

  • shutdown:关闭串口

串口就两大功能:发送数据、接收数据。 在Liteos-a中,发送数据比较简单:没有使用中断,而是使用查询方式逐个发送,核心是UartPutcReg。 接收数据时使用中断,所以需要注册串口接收中断处理函数,它要做的事情是:

  • 发生中断时,读取硬件获得字符,可能有多个字符

  • 处理特殊字符:比如不`\r`换为`\n`

  • 通知上层代码:udd->recv(udd, buf, count);

 

二、 鸿蒙串口内部的一些机制(流水账,新人可跳过)

        鸿蒙和其它操作系统一样,将设备分成了driver和device。device用来描述设备信息。driver用来做一些操作。比如不同品牌的内存我要用它来做的事情都是一样的,这部分的代码就是driver,而具体的它每个功能寄存器的地址,中断等等则在device里。

        这是一个设备的结构体对象,它的执行顺序其实就是从上往下的,先probe在attach(获得内存资源和中断资源)在detach最后shutdown结束。

        这里是它的一个调用过程,韦东山老师讲的这个课不太适合初学者,适合有一定基础的人。天才除外。我指的是正常人哦。因为我之前对linux的学习比较多加上去过好多公司实习,对底层的东西比较了解。鸿蒙的思想和linux很像所以可以快速上手。随着不断的学习,我发现大佬们的思想是一致的。很多优秀的项目都有共同的内核,这里不是操作系统的那个内核哦,是思想。最近也遇到了很多的问题,还是那句话,感兴趣,有精力的同学可以加群一起学,最好是我们一人研究一块后面在交流分享,这其实就是团队学习的意义。可以快速高效的掌握新技术。主要是我赶时间,呜呜呜呜。

        回到正题我们想要移植一个硬件设备其实就完成那个结构体就行,比较简单,其它的东西内核已经帮我们做了。linux驱动开发时也是这样,完成设备结构体中需要的函数成员,把结构体一写就好了,不论简单的设备还是复杂的设备思想上都是这样的。

三、串口移植

我们的目标是:让最小系统启动。 那么对于串口,不需要考虑得很全面:

  • 不需要初始化串口:u-boot已经初始化串口了

  • 不需要动态配置串口:固定使用某个波特率等配置就可以(在u-boot里设置过了)

移植工作只需要实现这几点:

  • 串口发送单个字符

  • 注册串口接收中断函数:确定中断号、使能中断、在中断函数中读取数据

3.1 串口发送单个字符

首先改下相关代码的名字

功能代码已经实现了,我们就改改地址啥的就行。

3.2 在device_t中指定资源

需要确定2个资源:寄存器地址、中断号

 这里设置串口的物理基地址

 

这里是串口的中断号

这里科普一下这里的SPI可不是那个通信总线哦。 

        SPI,即Shared Peripheral Interrupts,代表共享外设中断。这种中断类型来自于多个外设设备,例如IO外设等,并且这些设备共享相同的中断线。当任何一个这些外设需要引起CPU的注意时,它们会触发SPI。由于多个设备共享同一中断线,因此中断处理程序需要能够区分是哪一个设备触发了中断,这通常通过读取中断状态寄存器来实现。

        SGI,即Software Generated Interrupts,是软件生成的中断。这种中断不是由硬件外设触发的,而是由软件程序(如操作系统或驱动程序)通过写入特定的寄存器或执行特定的指令来生成的。SGI通常用于软件层面的通信和事件处理,例如任务调度、线程同步等。由于SGI是由软件控制的,因此它们具有高度的灵活性和可编程性。

        PPI,通常指CPU Private Peripheral Interrupts,即CPU私有外设中断。这是一种中断类型,用于处理CPU与私有外设之间的通信和事件响应。PPI在计算机系统中扮演着重要角色,帮助CPU及时响应和处理来自外设的中断请求。

然后

我们改成串口2,因为exynos4412的uboot初始化的是串口2的资源

然后这里也有一个坑这里需要修改 

        还有这里不是改PBASE,PBASE都没人用,改BASE或者说PBASE是base的地址,需要一个宏转化一下

想找下这个宏在哪定义的这个sg vscode恶心死了,跳转一直加载不出来,可恶。换source insight

访问虚拟机的IP然后映射到本地网络虚拟磁盘方便操作

 新建个目录放工程文件,这里没有权限。

sudo chmod -R go+rwx /home/book

现在就没问题了

新建工程

添加vendor目录

添加kernel里的liteos-a目录

添加drivers目录

这里添加汇编文件不然会加不进来

点开后把liteos-a重新加一下,然后同步文件

有点慢等一会,其它操作可以参考我以前的文章

Source Insight的学习_source insight read only-CSDN博客

不知道为什么要这样,猜测不能用物理地址可能要转化成对应虚拟地址用

这些名字也需要改

然后里面的内容做个替换

 然后我们来编译一下

        整型溢出了 

        发现鸿蒙源码的一个bug这里为什么用有符号整型啊,我基地址0x4000 0000,内存大小一个G加起来是0x8000 0000改好超过有符号整型的限制。内存映射限制在有符号整型的话岂不是意味着设备最多只能有2个G的内存。

        我在官方的社区下发了帖子不知道会不会回我。下面这个链接。有人回的话兄弟们踢我一下。

https://bbs.csdn.net/topics/618273814

这里先改小一点点。

又来咯

再给LCD让一部分空间,无语啦。

 

 

3.3 实现uart_ops

在UART驱动程序里,uart_ops结构体封装了UART的硬件操作:

uart_ops里有4个函数:

  • config:配置串口,比如波特率等

  • startup:启动串口,比如注册中断处理函数、启动串口

  • start_tx:发送字符串

  • shutdown:关闭串口

我们只需要实现startup、start_tx,其他函数可以设为空:

  • startup:确定中断号、request_irq、使能中断、提供中断处理函数

  • start_tx:发送字符串

3.4 GIC

kernel\liteos_a\platform\main.c中,调用OsSystemInfo打印系统信息时,代码如下:

    PRINT_RELEASE("\n******************Welcome******************\n\n""Processor   : %s"
#if (LOSCFG_KERNEL_SMP == YES)" * %d\n""Run Mode    : SMP\n"
#else"\n""Run Mode    : UP\n"
#endif"GIC Rev     : %s\n""build time  : %s %s\n""Kernel      : %s %d.%d.%d.%d/%s\n""\n*******************************************\n",LOS_CpuInfo(),
#if (LOSCFG_KERNEL_SMP == YES)LOSCFG_KERNEL_SMP_CORE_NUM,
#endifHalIrqVersion(), __DATE__, __TIME__,\KERNEL_NAME, KERNEL_MAJOR, KERNEL_MINOR, KERNEL_PATCH, KERNEL_ITRE, buildType);

里面的HalIrqVersion函数用到的GIC的虚拟地址,要正确设置,否则没有打印信息。 IMX6ULL的内存映射代码里,设备空间从GIC开始映射,所以GIC的虚拟地址就是PERIPH_DEVICE_BASE

// kernel/liteos_a/kernel/base/include/los_vm_zone.h
#define GIC_VIRT_BASE    PERIPH_DEVICE_BASE
​
// vendor/democom/demochip/board/include/asm/platform.h
#define GIC_BASE_ADDR             (GIC_VIRT_BASE)

四、启动后测试

        在启动文件中有这样一段

这样启动时串口有打印我们就知道启动成功了

栈的初始化我们是从0x4000 0000开始的后面的大小是内核的大小liteos-a不会大于16MB

        看过我之前做linux系统移植的兄弟们应该知道之前在4412上运行裸机程序都是在40008000这个地址上,我猜测这个8000可能是uboot的大小,但是后面问了华清的老师这个是武老师的个人喜好,好家伙我直接好家伙。uboot其实不在这运行,在内存运行的话不久死循环了么,因为内存是uboot初始化的哇哈哈。应该是soc内部还有一小段空间可供uboot在启动时使用,或者可能cpu直接去存放uboot的ROM里取的,以上都是猜测后面有机会研究一下这个芯片的启动过程。

        汇编要跳转的测试函数我们放到这个文件里,这里要定义一下串口控制器的位置,其实这里有个问题,就是这个代码不是通用的我们这个等待发送完成要根据自己的芯片手册做偏移。还有这个发送缓冲区的位置,这个通常也是个寄存器地址和这个串口相关的代码大概都在串口的地址做偏移的位置,一般会对整个串口的寄存器做个大的结构体。这里由于架构就不对我们只能先意思一下咯。

虚拟地址加载完在做个打印测试

这里我们前面定义过宏,切记写代码不要魔鬼数字,后面自己都不知道是干嘛的了。

因为对应结构体没实现后面这里一定会报错的,我就先注释掉了

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

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

相关文章

docker学习笔记 三-----docker安装部署

我使用的部署环境是centos 7.9 1、安装依赖工具 yum install -y yum-utils device-mapper-persistent-data lvm2 安装完成如下图 2、添加docker的软件信息源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo url地址为如…

QGraphicsView的使用,view坐标,scene坐标,item坐标

Graphics View绘图构架 QGraphicsScene(场景):可以管理多个图形项QGraphicsItem(图形项):也就是图元,支持鼠标事件响应。QGraphicsView(视图):关联场景可以让…

canvas跟随鼠标移动画带透明度的线

提示&#xff1a;canvas画线 文章目录 前言一、带透明度的线二、试错&#xff0c;只有lineTo的时候画&#xff0c;只有最后地方是透明度的三、试错&#xff0c;只存上一次的点&#xff0c;线会出现断裂的情况总结 前言 一、带透明度的线 test.html <!DOCTYPE html> &l…

Linux:执行命令的命令eval与Bash解析命令的方式

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 eval命令用于接收参数&#xff0c;并将这些参数作为一行命令执行&#xff0c;这也许会使人困惑&#xff0c;为什么我不能直接执行命令而需要使用eval命令间接执行呢&…

MySQL数据库事务介绍

前言 在MySQL数据库中&#xff0c;事务&#xff08;Transaction&#xff09;是指一组SQL语句的执行序列&#xff0c;这些SQL语句要么全部执行成功&#xff0c;要么全部执行失败&#xff0c;保证数据库的一致性和完整性&#xff1b;用于操作量大、复杂度高的数据。 目录 一、…

Python之Web开发中级教程----Django站点管理

Python之Web开发中级教程----Django站点管理 网站的开发分为两部分&#xff1a;内容发布和公共访问 内容发布是由网站的管理员负责查看、添加、修改、删除数据 Django能够根据定义的模型类自动地生成管理模块 使用Django的管理模块, 需要按照如下步骤操作 : 1.管理界面本地…

Deep Graph Representation Learning and Optimization for Influence Maximization

Abstract 影响力最大化&#xff08;IM&#xff09;被表述为从社交网络中选择一组初始用户&#xff0c;以最大化受影响用户的预期数量。研究人员在设计各种传统方法方面取得了巨大进展&#xff0c;其理论设计和性能增益已接近极限。在过去的几年里&#xff0c;基于学习的IM方法的…

企业如何利用数字工厂管理系统打造自动化产线

随着信息技术的飞速发展&#xff0c;数字化转型已成为企业提升生产效率、降低成本、优化管理的重要手段。数字工厂管理系统作为数字化转型的核心组成部分&#xff0c;其在打造自动化产线方面的作用日益凸显。本文将探讨企业如何利用数字工厂管理系统打造自动化产线&#xff0c;…

【QED】斐波那契游戏

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 总结 题目 题目链接&#x1f517; 斐波那契数列指的是这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#x…

边缘自动隐藏窗体,透明度切换,同步父窗体标签切换winform

一、实现功能 默认的标签栏(superTabControl) 可以设置隐藏,即可实现全屏最大化。通过列表切换打开的标签页。用于定制B/S模式系统显示更个性,自定义样式,简介 安全 兼容性好。 二、主要代码 private void Time_Tick(object sender, EventArgs e) {获取主屏

亚马逊AWS展示高效纠错的全新量子比特!

亚马逊网络服务公司&#xff08;AWS&#xff09;在量子计算的纠错技术领域取得了显著成就&#xff0c;极大地简化了量子系统的复杂性和资源需求。他们的研究人员通过采用“双轨擦除”量子比特&#xff08;dual-rail erasure qubit&#xff09;技术&#xff0c;有效地克服了量子…

推荐一种Bean注入方式——开发经验

我们都知道三种Bean注入的方式分别是属性注入&#xff0c;setter方法注入&#xff0c;构造器注入。这三种Bean注入的方式各有优缺点&#xff0c;但是相对来说更推荐使用构造器注入的方式。 1、构造器注入的优缺点 优点&#xff1a; 1、可以注入不可变对象 因为构造方法注入是…

算法-图的强连通分量,图的最小生成树

1.图的强连通分量 (1). 定义 图的强连通分量是图论中的一个重要概念&#xff0c;主要在有向图中进行讨论。具体来说&#xff0c;如果在一个有向图G中&#xff0c;任意两个顶点vi和vj&#xff08;其中vi大于vj&#xff09;之间都存在一条从vi到vj的有向路径&#xff0c;同时也存…

分享基于PDF.js的pdf阅读器代码

一、前言 有时候开发PC端web页面的时候会遇到PDF预览、下载等功能&#xff0c;为了兼容浏览器&#xff0c;需要找一款前端插件进行开发。比较好的PDF插件&#xff0c;就是mozilla的pdf.js&#xff08;注意是mozilla&#xff0c;如果你百度遇到需要收费的&#xff0c;那应该是下…

python矢量算法-三角形变化寻找对应点

1.算法需求描述 现有随机生成的两个三角形A与B&#xff0c;在三角形A中存在Pa&#xff0c;使用算法计算出三角形B中对应的点Pb 2.python代码 import numpy as np # 计算三角形A的面积 def area_triangle(vertices): return 0.5 * np.abs(np.dot(vertices[0] - vertices[…

品时尚精酿啤酒,探秘时尚背后的故事

在琳琅满目的啤酒市场中&#xff0c;Fendi Club啤酒以其时尚的风格和品质&#xff0c;成为了引人注目的焦点。这款啤酒不仅是一种味觉的享受&#xff0c;更是一种时尚与品味的象征。接下来&#xff0c;让我们一起探索Fendi Club啤酒背后的故事。 一、Fendi Club啤酒的特色 Fen…

师徒互电,眼冒金星,采集系统变电刺激系统!

原文来自微信公众号&#xff1a;工程师看海&#xff0c;很高兴分享我的原创文章&#xff0c;喜欢和支持我的工程师&#xff0c;一定记得给我点赞、收藏、分享哟。 加微信[chunhou0820]与作者进群沟通交流 电的我眼冒金星&#xff0c;以为自己被三体召唤&#xff0c;整个世界为我…

什么是浏览器指纹识别?Maskfog指纹浏览器有用吗?

浏览器指纹识别是好是坏&#xff1f;这现在确实是一个有争议的话题。83%的消费者经常或偶尔会根据浏览历史记录看到广告。其实这就是利用了浏览器指纹技术。 如果您想了解浏览器指纹识别是什么&#xff0c;那就看下去&#xff01; 一、什么是浏览器指纹识别 浏览器指纹是指无…

鸿蒙一次开发,多端部署(四)工程管理

DevEco Studio的基本使用&#xff0c;请参考DevEco Studio使用指南。本章主要介绍如何使用DevEco Studio进行多设备应用开发。 说明&#xff1a; 本章的内容基于DevEco Studio 3.1.1 Release版本进行介绍&#xff0c;如您使用DevEco Studio其它版本&#xff0c;可能存在文档与产…

《妈妈是什么》笔记(一)孩子都有被关注的需求

简介 作者渡渡鸟&#xff0c; 其本名韩谨&#xff0c;微博原创育儿理念、故事、分享妈妈经。毕业于中国社科院哲学系&#xff0c;有过八年记者生涯。育有一儿两女&#xff0c;在中美两国生活&#xff0c;熟悉跨文化养育&#xff0c;有坚定的根文化意识。 渡渡鸟妈妈能够基于孩…