自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(386)
  • 收藏
  • 关注

原创 嵌入式LINUX开发成长计划

嵌入式LINUX开发成长计划

2024-05-28 18:59:40 869 1

原创 嵌入式MCU开发成长计划

单片机工程师的2年成长计划

2022-07-07 13:50:00 4010 4

原创 进一步认识ICMP协议

ICMP是 Internet Control Message Protocol 的缩写,即互联网控制消息协议。它是互联网协议族的核心协议之一。它用于 TCP/IP 网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使网络管理者可以对所发生的问题作出诊断,然后采取适当的措施解决问题。为什么需要ICMP协议?IP协议的缺点1、IP协议没有差错报文或差错纠正机制2、IP协议缺少一种为主机和管理查询的基址所以ICMP协议就是为了补充IP协议的这两个缺点而设计的,配合IP协议使用。

2024-10-29 22:58:19 717

原创 在linux中是如何运行一个应用程序的?

注意,这个过程我们只编译了这个应用程序,并没有编译Linux内核,也就是说,该可执行程序a.out是独立于Linux内核的。linux中有大量的可执行程序,比如/bin目录下面的所有程序,这些程序一般都是我们手动去执行的,如果想要自启动,也就是linux内核启动之后就跟着启动,可以在rcs脚本中写上执行语句,这就是程序的自启动方法。综上所述,程序被放在根文件系统下是因为根文件系统是Linux系统启动和运行的基础,它包含了系统启动和运行所必需的关键文件和目录,并且是挂载其他文件系统的前提。

2024-10-28 19:54:59 657

原创 开发中和linux命令功能相对应的一些函数整理

文件的权限检查不单单只讨论文件本身的权限,还需要涉及到文件所在目录的权限,只有同时都满足了,才能通过操作系统的权限检查,进而才可以对文件进行相关操作;system()函数其内部的是通过调用 fork()、execl()以及 waitpid()这三个函数来实现它的功能,首先 system()会调用 fork()创建一个子进程来运行 shell(可以把这个子进程成为 shell 进程),并通过 shell 执行参数command 所指定的命令。检查项通过则返回 0,表示拥有相应的权限并且文件存在;

2024-10-25 10:36:39 815

原创 基于Linux来讲解Kconfig的基础知识

menuconfig是Linux平台用于管理代码工程、模块及功能的实用工具。上至决定某一程序模块是否编译,下到某一行具体的代码是否需要编译以及某个项的值在本次编译时该是什么都可由menuconfig来定义。menuconfig的使用方式通常是在编译系统之前在系统源代码根目录下执行 make menuconfig 命令从而打开一个图形化配置界面,再通过对各项的值按需配置从而达到影响系统编译结果的目的。

2024-10-24 19:24:27 966

原创 Linux中Kconfig结构分析

目录结构中,某一层的内容无非就是,要么全是目录,要么全是文件,要么既有目录又有文件,我们的Kconfig文件通常是分布在各级目录中。那么,这些Kconfig如何一层一层地去组织起来呢?首先明确下,什么时候需要Kconfig呢?在某个层级中的文件需要用CONFIG_XX_XX宏来控制的时候,就可以在该层级下写一个Kconfig。我们知道,Kconfig是从上到下层层调用的,所以,我们每写一个Kconfig,都需要将其和上层的Kconfig给关联起来。

2024-10-23 22:50:34 988

原创 Linux SPI 驱动实验

从示例代码 62.2.3 可以看出,spi_imx_buf_tx_u8 函数是通过 MXC_SPI_BUF_TX 宏来实现的。比如在裸机篇中的《第二十七章 SPI 实验》,我们编写了 bsp_spi.c 和 bsp_spi.h这两个文件,这两个文件是 I.MX6U 的 SPI 控制器驱动,我们编写好 SPI 控制器驱动以后就可以直接使用了,不管是什么 SPI 设备,SPI 控制器部分的驱动都是一样,我们的重点就落在了种类繁多的 SPI 设备驱动。

2024-10-18 20:49:15 862

原创 Linux I2C 驱动实验

首先肯定要描述 I2C 设备节点信息,先来看一下没有使用设备树的时候是如何在 BSP 里面描述 I2C 设备信息的,在未使用设备树的时候需要在 BSP 里面使用 i2c_board_info 结构体来描述一个具体的 I2C 设备。i2c_imx_start、i2c_imx_read、i2c_imx_write 和 i2c_imx_stop 这些函数就是 I2C 寄存器的具体操作函数,函数内容基本和我们裸机篇中讲的 I2C 驱动一样,这里我们就不详细的分析了,大家可以对照着第二十六章实验自行分析。

2024-10-18 20:44:54 543

原创 Linux RTC 驱动实验

rtc_dev_ioctl 函数对其他的命令处理都是类似的,比如 RTC_ALM_READ 命令会通过 rtc_read_alarm 函数获取到闹钟值,而 rtc_read_alarm 函数经过层层调用,最终会调用 rtc_class_ops 中的 read_alarm 函数来获取闹钟值。第 307 行,调用 devm_rtc_device_register 函数向系统注册 rtc_devcie,RTC 底层驱动集为snvs_rtc_ops。关于 I.MX6U 内部 RTC 驱动源码就讲解到这里。

2024-10-18 12:10:27 848

原创 Linux LCD 驱动实验

屏幕参数信息属于屏幕设备信息内容,这些肯定是要放到设备树中的,因此我们本章实验的主要工作就是修改设备树,NXP 官方的设备树已经添加了 LCD 设备节点,只是此节点的 LCD 屏幕信息是针对 NXP 官方 EVK 开发板所使用的 4.3 寸 480*272 编写的,我们需要将其改为我们所使用的屏幕参数。LCD 是很常用的一个外设,在裸机篇中我们讲解了如何编写 LCD 裸机驱动,在 Linux 下LCD 的使用更加广泛,再搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。

2024-10-17 20:07:41 689

原创 Linux INPUT 子系统实验

当我们向 Linux 内核注册好 input_dev 以后还不能高枕无忧的使用 input 设备,input 设备都是具有输入功能的,但是具体是什么样的输入值 Linux 内核是不知道的,我们需要获取到具体的输入值,或者说是输入事件,然后将输入事件上报给 Linux 内核。第 33~37 行,驱动出口函数,第 35 行调用 input_unregister_device 函数注销前面注册的input_dev,第 36 行调用 input_free_device 函数删除前面申请的 input_dev。

2024-10-16 15:50:33 781

原创 Linux MISC 驱动实验

所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。第 97~101 行,MISC 设备 beep_miscdev,第 98 行设置子设备号为 144,第 99 行设置设备名字为“miscbeep”,这样当系统启动以后就会在/dev/目录下存在一个名为“miscbeep”的设备文件(我们最终需要的也就是这个设备节点)。MISC 驱动其实就是最简单的字符设备驱动,通常嵌套在 platform 总线驱动中,实现复杂的驱动,本章我们就来学习一下 MISC 驱动的编写。

2024-10-16 11:15:52 570

原创 Linux异步通知实验

我们首先来回顾一下“中断”,中断是处理器提供的一种异步机制,我们配置好中断以后就可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数,在中断服务函数中做具体的处理。这些信号就相当于中断号,不同的中断号代表了不同的中断,不同的中断所做的处理不同,因此,驱动程序可以通过向应用程序发送不同的信号来实现不同的功能。阻塞、非阻塞、异步通知,这三种是针对不同的场合提出来的不同的解决方法,没有优劣之分,在实际的工作和学习中,根据自己的实际需求选择合适的处理方法即可。

2024-10-15 17:05:40 435

原创 Linux 阻塞和非阻塞 IO 实验

阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式,在编写驱动的时候一定要考虑到阻塞和非阻塞。本章我们就来学习一下阻塞和非阻塞 IO,以及如何在驱动程序中处理阻塞与非阻塞,如何在驱动程序使用等待队列和 poll 机制。

2024-10-15 15:17:32 1153

原创 Linux驱动中的并发与竞争处理

并发就是多个“用户”同时访问同一个共享资源,比如你们公司有一台打印机,你们公司的所有人都可以使用。现在小李和小王要同时使用这一台打印机,都要打印一份文件。小李要打印的文件内容如下:小王要打印的内容如下:这两份文档肯定是各自打印出来的,不能相互影响。当两个人同时打印的话如果打印机不做处理的话可能会出现小李的文档打印了一行,然后开始打印小王的文档,这样打印出来的文档就错乱了,可能会出现如下的错误文档内容:可以看出,小王打印出来的文档中电话号码错误了,变成小李的了,这是绝对不允许的。

2024-10-14 13:58:21 1041

原创 Linux的pinctrl和gpio子系统

上一章我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式中硬件初始化这一部分和裸机基本没啥区别。Linux 是一个庞大而完善的系统,尤其是驱动框架,像 GPIO 这种最基本的驱动不可能采用“原始”的裸机驱动开发方式,否则就相当于你买了一辆车,结果每天推着车去上班。Linux 内核提供了 pinctrl 和 gpio 子系统用于GPIO 驱动,本章我们就来学习一下如何借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。

2024-10-13 15:10:01 792

原创 linux log rotation日志滚动总结

例如,可以设置每天旋转一次日志文件,保留最近7天的日志,并对超过一周的日志进行压缩和删除。这样的策略不仅有助于节省存储空间,还能确保重要的历史日志信息得以保存,同时避免旧的、不再需要的日志占用过多资源。例如,当一个日志文件增长到超过预定义的大小限制时,系统会自动将其重命名(如添加时间戳),并创建一个新的空日志文件来继续接收新的日志条目。总的来说,日志滚动是一种有效的日志管理策略,它通过自动管理日志文件的大小和生命周期,帮助系统维护良好的性能和稳定性。

2024-10-11 10:18:29 343

原创 Linux WIFI 驱动实验

正点原子的 I.MX6U-ALPHA 开发板目前支持两种接口的 WIFI:USB 和 SDIO,其中 USB WIFI 使用的芯片为RTL8188EUS或 RTL8188CUS,SDIO 接口的WIFI 使用芯片为 RTL8189FS,也叫做 RTL8189FTV。因此不建议大家使用。其实不管是在 I.MX6U 上,还是在其他的 SOC 上,USB WIFI 和 SDIO WIFI 的驱动都是类似的,大家可以参考本章教程讲 RTL8188、RTL8189 这两款 WIFI 的驱动移植到芯片或者开发板上。

2024-10-09 19:37:21 1359

原创 Linux网络驱动实验

和 IIC 一样,使用器件地址即可。比如三星 linux 开发板里面用的最多的 DM9000,因为三星的芯片基本没有内部 MAC(比如 S3C2440、S5PV210,4412 等),所以三星的开发板都是通过外置的 DM9000 来完成有线网络功能的,DM9000 对 SOC 提供了一个 SRAM 接口,SOC 会以 SRAM 的方式操作 DM9000。网络数据的接收过程恰好相反,网络底层驱动将接收到的原始数据打包成 sk_buff,然后发送给上层协议,上层会取掉相应的头部,然后将最终的数据发送给用户。

2024-10-09 19:32:35 1071

原创 Linux块设备驱动实验

直接参考【

2024-10-09 19:26:36 851

原创 Linux如何将驱动文件编译成独立的模块或者编译到内核?

首先,说下如何编译成独立的模块需要使用如下命令接下来对该指令进行说明make modules 命令的执行路径只能是内核源码顶层目录,执行结果是:读取内核源码顶层目录中的 Makefile 文件,找到里面定义的 modules 目标。另外,上面说了,执行make modules时回到linux源码顶层目录的Makefile文件里去找modules目标,但是,我们一般不会直接去修改顶层的Makefile,要不然每次增加一个模块就改一次,那样的话,就太麻烦了。这就是将驱动源码编译成独立模块的方式。

2024-10-09 16:44:30 498

原创 使用Buildroot进行根文件系统构建

前面我们学习了如何使用 busybox 来构建根文件系统,但是 busybox 构建的根文件系统不齐全,很多东西需要我们自行添加,比如 lib 库文件。在我们后面的驱动开发中很多第三方软件也需要我们自己去移植,这些第三方软件有很多又依赖其他的库文件,导致移植过程非常的繁琐。本章我们来学习一下另外一种实用的根文件系统构建方法,那就是使用 buildroot 来构建根文件系统。

2024-09-30 18:01:37 1336

原创 以太网开发基础-MAC和PHY

00:0C:E5:4B:F2:85 这个地址就可以作为LAN MAC地址 00:0C:E5:4B:F2:86 这个地址就可以作为WAN MAC地址 00:0C:E5:4B:F2:87 这个地址就可以作为无线 MAC地址。通常,路由器铭牌上标的是LAN侧的MAC地址,另外WAN侧和WIFI的MAC,总之,一般都是连续的。但是也有不连续的,根据实际情况来即可。

2024-09-25 19:48:37 295

原创 嵌入式中的多核开发和核间通信总结

而如果采用高速并口,则占用管脚多,硬件成本将会增加。在M核,将Virtio移植,并使用简化版的RPMsg,因为涉及到互斥锁和信号量,最终使用FreeRTOS完成过程的封装,流程框图如下方所示。处理器支持消息传递单元(MessagingUnit,简称MU)功能模块,通过MU传递消息进行通信和协调,芯片内的M控制核和A处理核通过通过寄存器中断的方式传递命令,最多支持4组MU双向传递消息,既可通过中断告知对方数据传递的状态,也可发送最多4字节数据,还可在低功耗模式下唤醒对方,是保证双核通信实时性的重要手段。

2024-09-24 19:33:23 1056

原创 Linux移植之系统烧写

上面的命令就是BootStrap阶段,也就是第一阶段,“file”表示要下载的文件位置,在firmware目录下,文件名字为u-boot-imx6ul%lite%%6uluboot%_emmc.imx,在 L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools-with-rootfs\mfgtools 下找到 cfg.ini 文件,该文件里包含了开发板的一些信息,查看 cfg.ini 文件可得 lite=l 以及一些字符串代表的值。

2024-09-21 11:25:13 1782

原创 Linux根文件系统构建(busybox)

上一小节说了,根文件系统里面就是一堆的可执行文件和其他文件组成的?根文件系统的这个“根”字就说明了这个文件系统的重要性,它是其他文件系统的根,没有这个“根”,其他的文件系统或者软件就别想工作。这个就是我们本章教程的目的,教大家来构建自己的根文件系统,这个根文件系统是满足 Linux 运行的最小根文件系统,后续我们可以根据自己的实际工作需求不断的去填充这个最小根文件系统,最终使其成为一个相对完善的根文件系统。dev 是 device 的缩写,所以此目录下的文件都是和设备有关的,此目录下的文件都是设备文件。

2024-09-21 11:05:59 1271

原创 Linux内核移植实战总结

直接参考【】I.MX6U嵌入式Linux驱动开发指南V1.81本文仅作为个人笔记使用,方便进一步记录自己的实践总结。前两章我们简单了解了一下 Linux 内核顶层 Makefile 和 Linux 内核的启动流程,本章我们就来学习一下如何将 NXP官方提供的 Linux 内核移植到正点原子的 I.MX6U-ALPHA 开发板上。通过本章的学习,我们将掌握如何将半导体厂商提供的 Linux BSP 包移植到我们自己的平台上。

2024-09-21 11:01:19 1072

原创 Linux内核启动流程

要分析 Linux 启动流程,同样需要先编译一下 Linux 源码,因为有很多文件是需要编译才会生成的。首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的。看完 Linux 内核的顶层 Makefile 以后再来看 Linux 内核的大致启动流程,Linux 内核的启动流程要比 uboot 复杂的多,涉及到的内容也更多,因此本章我们就大致的了解一下 Linux 内核的启动流程。

2024-09-21 10:55:11 375

原创 Linux内核顶层Makefile详解

先看一下如何编译 Linux 源码,这里编译 I.MX6U-ALPHA 开发板移植好的 Linux 源码,已经放到了开发板光盘中,路径为:开发板光盘->1、例程源码-> 3、正点原子 Uboot 和 Linux 出厂源码-> linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2,注意,正点原子出厂系统在不断的更新,因此压缩包的名字可能不同,一切以实际为准!关于 Linux 的起源以及发展历史,这里就不啰嗦了,网上相关的介绍太多了!

2024-09-21 10:53:09 1582

原创 U-Boot 移植实操总结

这个对于我们来说基本是不可能的,这个工作一般是半导体厂商做的,半导体厂商负责将 uboot 移植到他们的芯片上,因此半导体厂商都会自己做一个开发板,这个开发板就叫做原厂开发板,比如大家学习 STM32的时候听说过的discover 开发板就是ST自己做的。因为 NAND 核心版用的 256MB的 DRAM。前两章我们都是使用的正点原子提供的 uboot,本章我们就来学习如何将 NXP 官方的 uboot 移植到正点原子的 I.MX6ULL 开发板上,学习如何在 uboot 中添加我们自己的板子。

2024-09-21 10:45:02 1373

原创 U-Boot启动流程详解

本章我们来详细的分析一下 uboot 的启动流程,理清 uboot 是如何启动的。表 32.1.1 中的“变量”值可以在 u-boot.map 文件中查找,表 32.1.1 中除了__image_copy_start以外,其他的变量值每次编译的时候可能会变化,如果修改了 uboot 代码、修改了 uboot 配置、选用不同的优化等级等等都会影响到这些值。在 u-boot.lds 中有一些跟地址有关的“变量”需要我们注意一下,后面分析 u-boot 源码的时候会用到,这些变量要最终编译完成才能确定的!

2024-09-21 10:34:24 641

原创 U-Boot顶层Makefile详解

直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81本文仅作为个人笔记使用,方便进一步记录自己的实践总结。上一章我们详细的讲解了 uboot 的使用方法,其实就是各种命令的使用,学会 uboot 使用以后就可以尝试移植 uboot 到自己的开发板上了,但是在移植之前需要我们得先分析一遍 uboot的启动流程源码,得捋一下 uboot 的启动流程,否则移植的时候都不知道该修改那些文件。

2024-09-21 10:31:34 1456

原创 U-Boot的基本使用

直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81在上一篇中我们学习了如何进行 I.MX6U 的裸机开发,通过 21 个裸机例程我们掌握了I.MX6U 的常用外设。通过裸机的学习我们掌握了外设的底层原理,这样在以后进行 Linux 驱动开发的时候就只需要将精力放到 Linux 驱动框架上,在进行 Linux 驱动开发之前肯定需要先将Linux 系统移植到开发板上去。

2024-09-20 07:34:35 876

原创 I.MX6U裸机-主频和时钟配置实验

本教程需要修改寄存器CCM_CBCDR 的 AHB_PODF 位来设置AHB_ROOT_CLK 的时钟,所以在修改之前必须先关闭AHB_ROOT_CLK 的输出。从 图 16.1.6.3 可 以 看 出 , PERCLK_CLK_ROOT 来 源 有 两 种 : OSC(24MHz) 和IPG_CLK_ROOT,由寄存器 CCM_CSCMR1 的 PERCLK_CLK_SEL 位来决定,如果为 0 的话PERCLK_CLK_ROOT 的时钟源就是 IPG_CLK_ROOT=66MHz。

2024-09-19 07:35:56 1131

原创 I.MX6U裸机-C语言版LED灯实验

delay_short()和 delay()这两个函数是延时函数,delay_short()函数是靠空循环来实现延时的,delay()是对 delay_short() 的简单封装, 在 I.MX6U 工作在 396MHz(Boot ROM 设置 的 396MHz) 的主频的时候delay_short(0x7ff)基本能够实现大约 1ms 的延时,所以 delay()函数我们可以用来完成 ms 延时。第 5 行跟第 3 行一样,定义了一个名为“.data”的段,然后所有文件的“.data”段都放到这里面。

2024-09-19 07:32:37 1330

原创 I.MX6U裸机-汇编LED灯实验

本文主要参考正点原子《》第八章。

2024-09-11 22:55:35 1093

原创 用网卡的ap模式抓嵌入式设备的网络包

嵌入式设备不像pc上,有一些专门的工具比如wareshark来抓包,嵌入式设备中,有的可能集成了tcpdump,可以用来进行简单的抓包,但是不方便分析,况且有的嵌入式设备不一定就集成了tcpdump工具。因为之后嵌入式设备的联网操作都会经过该网卡,所以,直接用wareshark就能抓到设备的包。如果嵌入式设备是通过网线连接到电脑上,我们就可以直接在电脑上通过wareshark抓对应网口的包。如果嵌入式设备用的是wifi联网,此时,我们就需要借助网卡来抓包,具体怎么操作呢?然后,将嵌入式设备连上该热点。

2024-09-11 13:51:44 570

原创 在windows下抓空包(monitor网卡+Omnipeek,主流方案?)

另外,还有一种包,叫做空包,也就是空中包,即air bag,而不是空白的包blank bag,其实也就是空中的无线包。只要有无线经过的地方,就有数据包。我们的无线包其实也是通过无线网卡来传输的,我们借助无线网卡+wireshark,也可以抓到无线网卡上发送和接收的包,其中包括接收广播包。但是,跟有线一样,也只能抓到该无线网卡发送和接收的包。当我们的电脑是通过网线联网时,我们可以通过wireshark来抓取通过网口发送和接收到的包,其中包括单播包、多播包以及广播包等等,只要这个包是通过目标网口的。

2024-09-10 22:42:56 323

原创 在windows下抓空包(monitor网卡+wireshark+MNM)

另外,还有一种包,叫做空包,也就是空中包,即air bag,而不是空白的包blank bag,其实也就是空中的无线包。只要有无线经过的地方,就有数据包。我们的无线包其实也是通过无线网卡来传输的,我们借助无线网卡+wareshark,也可以抓到无线网卡上发送和接收的包,其中包括接收广播包。但是,跟有线一样,也只能抓到该无线网卡发送和接收的包。当我们的电脑是通过网线联网时,我们可以通过wareshark来抓取通过网口发送和接收到的包,其中包括单播包、多播包以及广播包等等,只要这个包是通过目标网口的。

2024-09-10 22:41:59 414

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除