- 博客(111)
- 收藏
- 关注
原创 Linux驱动开发——pinctrl 和 和 gpio 子系统实验
前面的项目中编写了基于设备数的LED驱动,这和裸机开发差不多,都是配置GPIO寄存器的相关参数。但是GPIO这种都是通用的接口,Linux内核中提供了统一的配置方式,可以通过pinctrl和gpio子系统去开发GPIO驱动。Linux驱动讲究驱动分离与分层,pinctrl子系统和gpio子系统就是分层思想的产物。在之前基于设备树或者裸机开发中,我们首先需要配置引脚的复用功能,然后再配置GPIO的相关参数。这里就可以将其分为两部分,一部分是引脚的配置,这个就是交给pinctrl子系统来处理的。
2024-11-11 22:15:50
1044
原创 Linux驱动开发——基于设备树的LED驱动开发
目前驱动开发都基于设备树开发,设备树文件中定义硬件属性,通过设备树来向内核传递相关的寄存器物理地址,驱动开发时使用一系列的of函数类从设备树中获取对应的属性,来执行对应的操作。在设备树文件中添加设备节点编写驱动程序,获取设备树中的相关属性使用设备树中获取到的相关属性来初始化LED所使用的GPIO。
2024-11-11 22:14:14
381
原创 Linux驱动开发——设备树
设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等,如下图所示:在以前的内核中,还没有采用设备树,内核源码中有大量的arch/arm/mach-xxx和arch/arm/plat-xxx文件夹,用于存储不同平台的板级信息,但随着芯片产业的发展,加入内核中的板级
2024-10-13 21:16:39
2613
原创 Ubuntu配置应用开机自启动
有些自己下载的应用想要配置开机自启动,比如snipaste,steam++等,可以通过一下步骤进行配置。这个里面就是开机自启动的一些应用,可以将自己想要自启动的应用添加到这个里面来。以上是snipaste配置,起一个名称,命令执行可执行文件,比如*.sh。这样重启后,应用就是自启动了。
2024-10-13 21:16:21
416
原创 Linux驱动开发——新字符设备驱动开发
之前的字符设备驱动,使用register_chrdev函数注册设备,使用的时候需要mknod命令创建设备节点。register_chrdev和unregister_chrdev是老版本的驱动使用的函数,新的字符设备驱动已经不再使用,而是使用Linux内核推荐的新字符设备驱动API函数。
2024-10-06 17:40:58
1160
原创 Linux驱动开发——LED驱动开发
本文是学习rk3568开发板驱动开发的记录,代码依托于rk3568开发板。Linux下外设驱动,最终都是配置相应的硬件寄存器,本文中的LED灯驱动也是对rk3568的io口进行配置。
2024-10-06 13:22:31
1160
原创 Ubuntu解决wine应用中文显示方块问题
wine安装之后,未安装对应的文字字体,只需要将一个windows系统中的字体文件拷贝到ubuntu中wine安装路径的对应位置就可以。替换完成之后重启wine应用就可以了。用户目录的wine这个隐藏文件夹中。windows字体文件路径。ubuntu上存储路径。
2024-10-06 13:21:46
468
原创 Android车载——VehicleHal运行流程(Android 11)
本篇主要讲解VehicleHal的主要运行流程,包括设置属性、获取属性、订阅属性、取消订阅、持续上报属性订阅等。
2024-10-06 13:20:37
2168
原创 Android车载——VehicleHal初始化(Android 11)
VehicleHal是AOSP中车辆服务相关的hal层服务。它主要定义了与汽车硬件交互的标准化接口和属性管理,是一个独立的进程。
2024-10-06 13:20:02
1747
原创 Linux驱动开发——字符设备驱动开发
字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。Linux应用程序向下调用驱动程序流程如下:在Linux中,一切皆是文件,驱动加载成功之后,会在dev目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx”(xxx 是具体的驱动文件名字)的文件进行相应的操作即可实现对硬件的操作。
2024-07-28 14:05:57
1943
原创 《第一行代码 第3版》学习笔记——第十一章 网络技术
Compose没有WebView控件,使用传统的WebView控件,创建一个WebViewClient对象,用于展示百度首页。loadUrl函数加载百度首页数据。javaScriptEnabled用于加载JavaScript样式由于baidu有自定义scheme,所以这里做了特殊处理。
2024-06-24 20:49:31
745
原创 Android上编译和使用curl
Android系统编译的时候默认是没有带curl工具的,但是在aosp源码中,却是有curl的源码包含。所以只需要编译curl,然后将其push到Android设备中,就可以使用curl命令了。
2024-06-24 20:49:08
1247
原创 Web开发——HTML&CSS
HTML:HyperText Markup Language,超文本标记语言超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内容。标记语言:由标签构成的语言,HTML标签都是预定义好的。HTML代码直接在浏览器中运行,HTML标签由浏览器解析。CSS:Cascading Style Sheet,层叠样式表,用于控制页面的样式(表现)。以下就是html代码以及css样式搭配之后的显示效果。
2024-05-20 22:08:52
611
原创 设计模式——策略模式
策略模式定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。策略模式用于封装不同算法,这些算法做相同的工作,只是实现不同策略模式通过Strategy抽象类为Context类提供了一系列可供重用的算法或行为,通过继承可以析取出算法中的公共方法。策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。策略模式封装了变化,就是用来封装算法的。
2024-02-25 23:39:15
406
原创 《第一行代码 第3版》学习笔记——第六章 广播
广播概念在计算机网络中就有,在一个IP网络范围中,最大的IP地址通常是被保留作为广播地址来使用的。广播的含义就是一个广播发出,范围内的应用程序都能够收到该广播。Android中的每个应用程序都可以对自己感兴趣的广播进行注册,注册后当广播发出时,就能够收到,可能是系统广播,也可能是其他应用程序的广播。广播接收的应用中需要有类来继承BroadcastReceiver类。
2024-02-25 23:38:50
1005
原创 AliOS编译三方库
CMAKE_INSTALL_PREFIX环境变量定义cmake执行make install命令时的安装路径。CMAKE_FIND_ROOT_PATH指示,编译依赖文件的根路径,可以设置成默认的。这里的TOOLCHAIN_ROOT是上面导出的环境变量,指向了编译后的ndk路径。源码解压后,存在CMakeLists.txt,可以通过cmake编译。首先将ndk拷贝到服务器中,这里准备将ndk解压到aliNDK中。执行完成之后,在out/install目录下生成相应文件。使用tar命令解压,并指定解压目录。
2024-02-16 22:53:35
1130
原创 Kotlin基础——类、对象和接口
kotlin中同样使用interface关键字来定义接口,接口的含义和Java中类似,用于定义抽象使用interface关键字定义接口。实现一个接口跟Java中不同,Kotlin中继承类和实现接口都是使用冒号。重写接口中的方法,使用override关键字,与Java中不同的是,override是必须写的,如果不写则会报错。这会避免先写出实现方法再添加抽象方法造成的意外重写。和Java一样,Kotlin中的类只能继承一个类,但可以实现多个方法。
2024-02-16 22:52:05
1791
原创 Kotlin基础——函数定义及调用
扩展函数看起来像是String的成员函数,但是实际上并不是,他只是一个将String作为第一个参数传入的函数,是归属于StringFunctions类的,所以假设想要继承String,并重写lastChar方法,这并不是重写,而只是在子类中定义了一个lastChar方法而已。Kotlin中可变参数可以这样添加,而Java中不可以,因为Java中传入的数组是一个整体,传入数组就不能加其他参数了,而Kotlin中因为将数据进行了展开,所以还可以传其他参数。中缀调用可以用于任何只有一个参数的函数,包括扩展函数。
2024-01-07 15:20:08
1400
原创 Linux命令——用户和权限相关
与UID和GID相关的是权限的管控,每一个文件都有所属的用户和用户组用以控制文件的访问权限,当我们ls -l需要显示用户和用户组的时候,实际是会根据/etc/passwd与/etc/group的内容找到对应的UID和GID对应的名称,再完成显示。切换到新用户,这里可以看到没有前面的主机名,用户名和目录的显示,这是因为在创建用户的使用没有指定shell,默认使用的是/bin/sh,一般指定为bash。至此,添加用户成功,这里的-m是创建用户主目录,如果不加,则没有用户主目录,会进入根目录。
2024-01-07 15:19:29
1008
原创 Kotlin基础——基础内容
上面属性默认的访问器都是编译器生成的,而如果要实现自己的逻辑,就需要自己自定义访问器get() {Rectangle类定义了一个属性isSquare,该属性用val修饰,只提供getter方法,而这个getter方法没有使用默认的getter,而是使用自定义的getter方法。自定义访问器就是对属性创建一个get函数或者set函数来自定义getter方法和setter方法。首先来看Java,Java中一个类文件可以包含多个类定义,但是只能有一个public定义的,且必须和类文件相同。
2023-12-11 20:50:23
1227
原创 C++基础——STL初识
STL(Standard Template Library)称为标准模板库,是C++标准库的一部分。诞生背景:大多数情况下,数据结构和算法未能有一套标准,导致被迫从事大量重复工作,STL就是为了建立数据接口跟和算法的一套标准而创建的。STL广义上可以分为:容器(container)、算法(algorithm)和迭代器(iterator)容器和算法通过迭代器进行连接STL中几乎所有的代码都采用模板类或者模板函数实现//自定义数据类型public:mAge = age;
2023-12-11 20:49:57
1052
原创 C++基础——文件操作
程序最基本的操作之一就是文件操作,程序运行时的数据都是临时数据,当程序结束后就不复存在了。通常都是通过文件或其他持久化存储方式存储程序运算完成的数据。文本文件:文本文件以ascii码存储到计算机中二进制文件:文件以二进制方式存储在计算机中,难以阅读ofstream:写操作ifstream:读操作fstream:读写操作。
2023-11-30 21:11:32
509
原创 C++基础——模板
模板是一种较为通用的模具,不能单独使用C++除了面向对象编程之外,还有一种是泛型编程,使用的就是模板C++中提供了两种模板:函数模板,类模板。
2023-11-30 21:10:55
1114
原创 C++基础——多态
多态是面向对象的三大特性之一,说的是同一个事物有不同的行为。静态多态:函数重载和运算符重载动态多态:派生类和虚函数实现静态多态和动态多态的区别:静态多态:函数地址早期绑定 - 编译阶段确定函数地址动态多态:函数地址晚期绑定 - 运行阶段确定函数地址。
2023-11-15 22:11:15
263
原创 C++基础——友元
友元就是定义类外可以访问的权限。友元可以定义一个类或者一个函数,定义成友元的类或者函数可以访问本类的所有成员,包含私有成员全局函数作为友元类做友元成员函数作为友元。
2023-11-11 11:37:36
122
原创 C++基础——运算符重载
程序员可以对C++中的+、=等运算符重新定义,以适应不同数据类型的计算。重载后的运算符不能改变原有运算符的运算规则(加号运算符不能重载为两个数相减)不能定义原本没有的运算符运算符重载语法:使用operator关键字,后接要重载的运算符,其他的都是和普通函数定义相同。
2023-11-11 11:37:13
294
原创 C++基础——对象模型和this指针
在C++中,类中的成员变量和成员函数是分开存储的只有非静态成员变量才属于类的对象上非静态成员变量会占用对象空间大小,对象的大小可以使用sizeof函数计算。一个对象的大小就是非静态成员所占内存之和。这里意外的是空类,空类占用一个字节大小。非静态成员变量属于类,不会占用对象空间大小。函数不会占用对象空间大小。
2023-11-07 23:17:26
112
原创 C++基础——函数
函数的参数可以设置默认值,在调用传参的时候如果没有传对应参数,则使用默认参数,如果传入了参数则使用会使用传入的参数覆盖默认参数。输出3 4 3需要注意的是,默认参数的设置只能是从右往左,如果某一个设置了默认参数,则只能在这个参数的右边出现默认参数,默认参数不能出现在中间,否则会引起混淆。
2023-10-23 22:49:18
180
原创 C++基础——结构体
定义一个学生的结构体//结构体定义//成员列表//姓名int age;//年龄int score;//分数}stu3;//结构体变量创建方式3//结构体变量创建方式1//struct 关键字可以省略stu1.name = "张三";cout << "姓名:" << stu1.name << " 年龄:" << stu1.age << " 分数:" << stu1.score << endl;//结构体变量创建方式2。
2023-10-17 22:03:38
283
原创 C++基础——指针
/1、指针的定义int a = 10;//定义整型变量a//指针定义语法: 数据类型 * 变量名;int * p;//指针变量赋值p = &a;//指针指向变量a的地址//打印数据a的地址//打印指针变量p//2、指针的使用//通过*操作指针变量指向的内存return 0;指针和普通变量的区别:普通变量存放的是数据,指针存放的是地址,指针变量可以通过“*”解除引用运算符获取指针变量指向的内存中存储的数据。&是取地址运算法,可以用于获取普通变量的地址赋值给指针变量。
2023-10-16 21:35:10
136
原创 C++基础——程序流程结构
if语句用于判定,如果条件满足则执行其中的代码,如果不满足则不执行。输入和输出输入和输出上面这种只支持两种判断,true走一路,false走一路输出。
2023-10-09 21:46:57
187
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人