
Linux 驱动以及裸机
文章平均质量分 63
嵌入式linux自学笔记
嵌入式学习者。
求知若渴,虚心若愚
展开
-
嵌入式Linux驱动开发(I2C专题)(七)
读I2C数据时,要先发出设备地址,这是写操作,然后再发起读操作,涉及写、读操作。vmware使用桥接,或者不使用vmware而是直接使用服务器:假设Ubuntu IP为192.168.1.137。这函数完全有驱动程序来驱动:启动传输后,就等待;在中断服务程序里传输下一个数据,知道传输完毕。在Ubuntu的IMX6ULL内核目录下执行如下命令,,上机实验时需要配置内核、编译I2C-GPIO驱动。在IMX6ULL内核源码目录下执行。开发板上挂载NFS文件系统。STM32MP157:函数。IMX6ULL:函数。原创 2023-09-18 16:16:10 · 614 阅读 · 0 评论 -
嵌入式Linux驱动开发(I2C专题)(六)
I2C在硬件上的接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻(放一个上拉电阻的原因以后我们再说)。主芯片通过一根SDA线既可以把数据发给从设备,也可以从SDA上读取数据,连接SDA线的引脚里面必然有两个引脚(发送引脚/接受引脚)。当SCL为低电平时候,大家都不应该使用IIC总线,只有当SCL从低电平变为高电平的时候,IIC总线才能被使用。当它就绪后,就可以不再驱动三极管,这是上拉电阻把SCL变为高电平,其他设备就可以继续使用I2C总线了。原创 2023-09-14 20:34:20 · 556 阅读 · 0 评论 -
嵌入式Linux驱动开发(I2C专题)(五)
方法3(不推荐):由i2c_driver.detect函数来判断是否有对应的I2C设备并生成i2c_client。i2c_driver跟i2c_client匹配成功后,就调用i2c_driver.probe函数。有时候无法知道该设备挂载哪个I2C bus下,无法知道它对应的I2C bus number。注册:i2c_add_adapter/i2c_add_numbered_adapter。调试时、或者不方便通过代码明确地生成i2c_client时,可以通过用户空间来生成。原创 2023-09-14 19:50:21 · 723 阅读 · 0 评论 -
嵌入式Linux驱动开发(I2C专题)(四)
参考资料:从芯片手册上可以知道,AT24C02的设备地址跟它的A2、A1、A0引脚有关:打开I2C模块的原理图(这2个文件是一样的):可以读1个字节,也可以连续读出多个字节。连续读多个字节时,芯片内部的地址会自动累加。当地址到达存储空间最后一个地址时,会从0开始。4. 编译4.1 在Ubuntu设置交叉编译工具链STM32MP157IMX6ULL4.2 使用I2C-Tools的源码为IMX6ULL编译时,有如下错误:这是因为IMX6ULL的工具链自带的include目录中原创 2023-09-14 16:36:02 · 454 阅读 · 0 评论 -
嵌入式Linux驱动开发(I2C专题)(三)
参考资料:APP访问硬件肯定是需要驱动程序的,对于I2C设备,内核提供了驱动程序,通过它可以直接使用下面的I2C控制器驱动程序来访问I2C设备。框架如下:i2c-tools是一套好用的工具,也是一套示例代码。使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。所以使用I2C-Tools时也需要指定:IMX6ULL修改I2C-Tools的Makefile指定交叉编译工具链在Makefile中,“?=”在第一次设置变量时才会起效果,如果之前原创 2023-09-13 21:27:50 · 586 阅读 · 0 评论 -
嵌入式Linux驱动开发(I2C专题)(二)
举例:设备地址为0x50的EEPROM,要读取它里面存储地址为0x10的一个字节,应该构造几个i2c_msg?i2c_msg中的flags用来表示传输方向:bit 0等于I2C_M_RD表示读,bit 0等于0表示写。使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。使用i2c_adapter表示一个I2C BUS,或称为I2C Controller。在上面的i2c_algorithm结构体中可以看到要传输的数据被称为:i2c_msg。原创 2023-09-13 20:22:16 · 278 阅读 · 0 评论 -
嵌入式Linux驱动开发(I2C专题)(一)
I2C协议中数据传输的单位是字节,也就是8位。I2C-tools中的函数:i2c_smbus_write_i2c_block_data()。I2C-tools中的函数:i2c_smbus_read_i2c_block_data()。I2C-tools中的函数:i2c_smbus_write_block_data()。I2C-tools中的函数:i2c_smbus_write_byte_data()。I2C-tools中的函数:i2c_smbus_write_word_data()。原创 2023-09-13 19:52:30 · 963 阅读 · 0 评论 -
嵌入式Linux驱动开发(同步与互斥专题)(二)
对于ARMv6及以上的架构,使用include/asm-generic/mutex-dec.h中的__mutex_fastpath_lock函数。对于ARMv6及以上的架构,使用include/asm-generic/mutex-dec.h中的__mutex_fastpath_lock函数。如果mutex的值加1后还是小于等于0,就表示有人在等待mutex,需要去wait_list把它取出唤醒,这需要用到slowpath的函数:__mutex_unlock_slowpath。原创 2023-09-08 20:28:04 · 386 阅读 · 0 评论 -
嵌入式Linux驱动开发(同步与互斥专题)(一)
在ARMv6以下的架构里,不支持SMP系统,关中断。在ARMv6及以上的架构中,不需要关中断,有ldrex、strex等指令。Linux内核提供了很多类型的锁,它们可以分为两类:① 自旋锁(spinning lock);② 睡眠锁(sleeping lock)。原创 2023-09-08 14:41:13 · 510 阅读 · 0 评论 -
嵌入式Linux驱动开发(LCD屏幕专题)(四)
即使APP速度很高,LCD控制器不断从Framebuffer中读取数据来显示,而APP不断把数据写入Framebuffer。上述两个缺点的根源是一致的:Framebuffer中的数据还没准备好整帧数据,就被LCD控制器使用了。APP:等待切换完成(在驱动程序中已经等待切换完成了,所以这个调用并无必要)APP:读取buffer信息。APP:开始切换buffer。驱动:分配多个buffer。驱动:保存buffer信息。APP:使能多buffer。APP:写buffer。驱动:切换buffer。原创 2023-09-07 15:33:07 · 678 阅读 · 0 评论 -
嵌入式Linux驱动开发(LCD屏幕专题)(三)
vmware使用桥接,或者不使用vmware而是直接使用服务器:假设Ubuntu IP为192.168.1.137。vmware使用NAT(假设windowsIP为192.168.1.100)上机测试:使用编译出来的内核、设备树启动板子。现象:LCD上没有企鹅LOGO,在终端中执行。加入我们编写的驱动程序、设备树文件。去除内核自带的驱动程序。重新编译内核、设备树。原创 2023-09-07 14:43:35 · 787 阅读 · 0 评论 -
嵌入式Linux驱动开发(LCD屏幕专题)(二)
文件:drivers\video\of_display_timing.c。文件:drivers\video\of_display_timing.c。文件:drivers\video\fbdev\core\modedb.c。文件:drivers\video\fbdev\core\fbmon.c。文件:drivers\video\fbdev\mxsfb.c。文件:drivers\video\videomode.c。文件:drivers\video\videomode.c。代码:clock-frequency。原创 2023-09-07 10:05:17 · 617 阅读 · 0 评论 -
嵌入式Linux驱动开发(LCD屏幕专题)(一)
总的分辨率是 yres*xres。原创 2023-09-06 17:59:43 · 1106 阅读 · 0 评论 -
Linux(驱动编程)(调试技术)(imx6ull)
查看次函数在那个.c里用过,然后在vscode界面下按alt+p搜索这个.c就可以参考这个.c的头文件。7、驱动程序执行printk函数时会关闭一段时间中断,调有些程序时尽量不要加printk。8、驱动函数xxx_init()的返回值(return)一定要有数值不然加载驱动会有问题。(1)配置pcie驱动(详情见手册EMC拨号指南_linux)4、 输入指令可查看各个中断发生的次数及申请情况。命令看看是否检测到网卡,如没检测到重新启动开发板。6、输入下面命令可打开内核调试信息。2、编译完驱动跟应用后先。原创 2023-07-12 10:33:46 · 652 阅读 · 0 评论 -
Linux驱动快速入门(vscode的使用)
3、在Linux内核源码首目录下有compile_commands.json文件,且这个文件内容“cc”改为了“xxxx-gcc”,后先清理之前编译的,后用bear make编译。1、安装了clangd插件。原创 2023-05-19 10:59:11 · 399 阅读 · 0 评论 -
Linux驱动快速入门(环境搭建)
配置成net模式只要Windows能上网ubantu一定能上网(如下图)给电脑新接一个USB网卡连接到虚拟机。原创 2023-05-19 09:43:19 · 173 阅读 · 0 评论 -
Linux驱动编程(驱动程序基石)(下)
这里要引入虚拟地址的概念:CPU 发出的地址是虚拟地址,它经过 MMU(Memory Manage Unit,内存管理单元)映射到物理地址上,对于不同进程的同一个虚拟地址,MMU 会把它们映射到不同的物理地址。分别执行 test 程序 2 次,最后执行 ps,可以看到这 2 个程序同时存在,这 2 个程序里 a 变量的地址相同,但是值不同。② 2 个程序同时运行,它们的变量 a 的值是不一样的,一个是 12,另一个是 123。你想映射某个内核 buffer,你需要得到它的物理地址,这得由你提供。原创 2023-05-13 21:10:39 · 1404 阅读 · 0 评论 -
Linux驱动编程(驱动程序基石)(上)
参考内核头文件:include\linux\workqueue.h。原创 2023-05-13 16:19:48 · 860 阅读 · 0 评论 -
Linux驱动编程(总线设备驱动模型)
⚫ platform_device.name 和 platform_driver.driver.name。原创 2023-05-06 16:12:33 · 1148 阅读 · 0 评论 -
Linux驱动编程(分层分离编程思想)
程序仍分为上下结构:上层 leddrv.c 向内核注册 file_operations 结构体;下层 chip_demo_gpio.c 提供 led_operations 结构体来操作硬件。下层的代码分为 2 个:chip_demo_gpio.c 实现通用的 GPIO 操作,board_A_led.c 指定使用哪个 GPIO,即“资源”。使用时,我们只需要在 board_A_led.c 中指定使用哪一个引脚即可。下层实现硬件相关的操作,比如 board_A.c 实现单板 A 的 LED 操作。原创 2023-05-05 15:49:40 · 1170 阅读 · 0 评论 -
Regmap API 实验
什么情况下会使用 regmap:①、硬件寄存器操作,比如选用通过 I2C/SPI 接口来读写设备的内部寄存器,或者需要读写 SOC 内部的硬件寄存器。②、提高代码复用性和驱动一致性,简化驱动开发过程。③、减少底层 I/O 操作次数,提高访问效率。原创 2023-03-30 21:19:15 · 1210 阅读 · 0 评论 -
Linux PWM 驱动实验
imx_pwm_enable、imx_pwm_disable 和 imx_pwm_config 这三个函数最终调用就是imx_pwm_config_v2 和 imx_pwm_set_enable_v2。imx_pwm_config_v2 函数就是最终操作 I.MX6ULL 的 PWM 外设寄存器,进行实际配置的函数。imx_pwm_enable、imx_pwm_disable 和 imx_pwm_config 这三个函数就是使能、关闭和配置PWM 的函数。PWM子系统的核心是 pwm_chip 结构体。原创 2023-03-30 19:12:04 · 731 阅读 · 0 评论 -
Linux 4G 通信实验
4G 模块原理图实物图。原创 2023-03-30 15:32:50 · 1546 阅读 · 2 评论 -
Linux 块设备驱动实验
块设备是针对存储设备的,比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等。块设备驱动相比字符设备驱动的主要区别如下:①、块设备只能以块为单位进行读写访问,块是 linux 虚拟文件系统(VFS)基本的数据传输单位。字符设备是以字节为单位进行数据传输的,不需要缓冲。②、块设备在结构上是可以进行随机访问的,对于这些设备的读写都是按块进行的,块设备使用缓冲区来暂时存放数据,等到条件成熟以后在一次性将缓冲区中的数据写入块设备中。原创 2023-03-29 16:09:06 · 1137 阅读 · 0 评论 -
Linux 多点电容触摸屏实验
1、多点触摸(MT)协议详解电容触摸屏驱动其实就是以下几种 linux 驱动框架的组合:①、IIC 设备驱动,因为电容触摸 IC 基本都是 IIC 接口的,因此大框架就是 IIC 设备驱动。②、通过中断引脚(INT)向 linux 内核上报触摸信息,因此需要用到 linux 中断驱动框架。坐标的上报在中断服务函数中完成。③、触摸屏的坐标信息、屏幕按下和抬起信息都属于 linux 的 input 子系统,因此向 linux 内核上报触摸屏坐标信息就得使用 input 子系统。原创 2023-03-27 09:14:56 · 1552 阅读 · 0 评论 -
Linux RS232/485/GPS 驱动实验
当 UART 设备和驱动匹配成功以后 serial_imx_probe 函数就会执行,此函数的重点工作就是初始化 uart_port,然后将其添加到对应的 uart_driver 中。uart_port 中的 ops 成员变量很重要,因为 ops 包含了针对 UART 具体的驱动函数,Linux 系统收发数据最终调用的都是 ops 中的函数。每个 UART 都有一个 uart_port,那么 uart_port 是怎么和 uart_driver 结合起来的呢?drv:要注册的 uart_driver。原创 2023-03-26 09:39:02 · 507 阅读 · 0 评论 -
Linux SPI 驱动实验
SPI驱动原创 2023-03-25 20:17:39 · 1509 阅读 · 0 评论 -
Linux I2C 驱动实验
I2C 设备和驱动的匹配过程是由 I2C 核心来完成的,drivers/i2c/i2c-core.c 就是 I2C 的核心部分,I2C 核心提供了一些与具体硬件无关的 API 函数。i2c_add_driver 就是对 i2c_register_driver 做了一个简单的封装,只有一个参数,就是要注册的 i2c_driver。这两个函数的区别在于 i2c_add_adapter 使用动态的总线号,而 i2c_add_numbered_adapter使用静态总线号。原创 2023-03-22 19:51:08 · 522 阅读 · 0 评论 -
Linux LCD 驱动实验
Linux 学习中见到“Framebuffer”或者“fb”的话第一反应应该想到 RGBLCD或者显示设备。当我们编写好 LCD 驱动以后会生成一个名为/dev/fbX(X=0~n)的设备,应用程序通过访问/dev/fbX 这个设备就可以访问 LCD。原创 2023-03-21 21:21:35 · 804 阅读 · 0 评论 -
Linux INPUT 子系统实验
input_envent 这个结构体非常重要,因为所有的输入设备最终都是按照 input_event 结构体呈现给用户的,用户应用程序可以通过 input_event 来获取到具体的输入事件或相关的值,比如按键值等。④、卸载input驱动的时候需要先使用input_unregister_device函数注销掉注册的input_dev,然后使用 input_free_device 函数释放掉前面申请的 input_dev。code:事件码,也就是我们注册的按键值,比如 KEY_0、KEY_1 等等。原创 2023-03-21 16:06:52 · 350 阅读 · 0 评论 -
Linux MISC 驱动实验
所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。// miscdevice 结构体代码 struct miscdevice {int minor;/* 子设备号 */ const char * name;/* 设备名字 */ const struct file_operations * fops;/* 设备操作集 */ struct list_head list;12356255。原创 2023-03-21 10:29:47 · 214 阅读 · 0 评论 -
platform设备驱动实验
1、platform 总线. . . };match 函数,此函数很重要,此函数就是完成设备和驱动之间匹配的,总线就是使用 match 函数来根据注册的设备来查找对应的驱动,或者根据注册的驱动来查找相应的设备,因此每一条总线都必须实现此函数。match 函数有两个参数:dev 和 drv,这两个参数分别为 device 和 device_driver 类型,也就是设备和驱动。就是 platform 平台总线,其中就是匹配函数。= NULL;2、 platform 驱动。原创 2023-03-20 19:28:05 · 552 阅读 · 0 评论 -
设备树下的 platform 驱动编写
platform 驱动框架分为总线、设备和驱动,其中总线不需要我们这些驱动程序员去管理,这个是 Linux 内核提供的,我们在编写驱动的时候只要关注于设备和驱动的具体实现即可。在没有设备树的 Linux 内核下,我们需要分别编写并注册 platform_device 和 platform_driver,分别代表设备和驱动。在使用设备树的时候,设备的描述被放到了设备树中,因此 platform_device 就不需要我们去编写了,我们只需要实现 platform_driver 即可。原创 2023-03-20 20:23:30 · 291 阅读 · 0 评论 -
IMX6ULL自学笔记(princrtl,gpio子系统)
princrtl,gpio子系统原创 2023-03-15 21:56:28 · 1083 阅读 · 0 评论 -
Linux并发与竞争
①、多线程并发访问,Linux 是多任务(线程)的系统,所以多线程访问是最基本的原因。②、抢占式并发访问,从 2.6 版本内核开始,Linux 内核支持抢占,也就是说调度程序可以在任意时刻抢占正在运行的线程,从而运行其他的线程。③、中断程序并发访问,这个无需多说,学过 STM32 的同学应该知道,硬件中断的权利可是很大的。④、SMP(多核)核间并发访问,现在 ARM 架构的多核 SOC 很常见,多核 CPU 存在核间并发访问。原创 2023-03-16 22:14:49 · 375 阅读 · 0 评论 -
IMX6ULL 自学笔记(驱动开发)
嵌入式linux驱动开发基础原创 2023-03-08 21:29:30 · 1015 阅读 · 0 评论 -
内核编译出现arch/arm/boot/Makefile:52: recipe for target ‘arch/arm/boot/compressed/vmlinux‘ failed
linux编译原创 2023-03-03 22:29:28 · 779 阅读 · 0 评论 -
IMX6ULL 自学笔记(Makefile 以及 系统移植)
嵌入式linux驱动原创 2022-12-13 17:49:29 · 1700 阅读 · 0 评论 -
嵌入式(计算机硬件基础)
计算机硬件基础原创 2022-10-18 14:09:15 · 342 阅读 · 0 评论 -
嵌入式(ARM处理器概论)
ARM原创 2022-10-18 18:57:53 · 210 阅读 · 0 评论