自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2. 开发环境搭建及平台介绍

2021-12-05 08:05:03 611

原创 1. ARM体系结构概述

文章目录必须get的ARM知识Cortex-M0概述认识STM32STM32F0硬件平台介绍必须get的ARM知识STM32的核心CPU都是Cortex-M系列的处理器。SOC:片上系统。如:STM32F0CPU:如:M0Cortex-M0概述唤醒中断控制器:是STM32F0实现低功耗的关键。当外设有响应了再通知电源管理接口给外设供电,否则整个STM32处于休眠状态。认识STM32STM32F0硬件平台介绍...

2021-12-04 13:46:31 2997

原创 9.设备树(下)

文章目录在dts中添加新的节点of解析dts节点的API代码中获取节点获取属性获取属性中的整数数组获取属性中字符串数组定义和获取dts中的中断信息验证dts的中断信息dts替代平台设备的pdev硬编码方式在dts中添加新的节点arch/arm/boot/dts/exynos4412-fs4412.dts在顶层目录make dtbscp arch/arm/boot/dts/exynos4412-fs4412.dtb /tftpboot/of解析dts节点的API重启开发板,cd proc/dev

2021-11-01 08:06:19 437

原创 7.I2C子系统(下)

文章目录MPU6050的I2C driver驱动框架编写MPU6050操作寄存器读取MPU6050数据寄存器并上报给用户应用程序读取重力加速度和陀螺仪的值MPU6050的I2C driver驱动框架编写1.搭建驱动模块基本框架2.在init函数中构建i2c driver,并注册到i2c总线i2c_add_driver(struct i2c_driver *driver)并且在exit函数中释放i2c_del_driver(struct i2c_driver *driver)3.在i2c_driv

2021-11-01 08:05:54 273

原创 8.设备树(上)

文章目录初识设备树设备树的由来设备树文件的编译内核使用dtb文件的过程节点和属性常见的属性compatible_reg等初识设备树设备树是硬件的配置文件。设备树的由来设备树文件的编译dtc——device tree compiler.dtsi——i是include的意思,这种文件类似C语言的头文件,将通用的信息写在里面,供.dts文件包含内核使用dtb文件的过程节点和属性属性常见的属性compatible_reg等compatible属性用来限制子节点中reg的地址和长

2021-10-30 10:29:17 167

原创 6.I2C子系统(上)

文章目录I2C协议和时序Linux I2C驱动框架Linux I2C总线和平台总线的结合Linux I2C从设备的设备树信息的添加Linux I2C client_driver_adapter_msg等对象的讲解I2C协议和时序I2C驱动开发:I2C从设备驱动开发硬件芯片:从设备cmos camerats :电容触摸屏gsenor: 重力传感器eeprom: 存储设备HDMI:高清输出接口Linux I2C驱动框架Linux I2C总线和平台总线的结合2,i2c子系统软件框架应

2021-10-28 14:51:32 329

原创 5.输入子系统 4

文章目录evdev_open的实现过程open("/dev/event1", O_RDWR);vfs sys_open(); struct file file->f_ops = cdev->ops; file->f_ops->open();evdev_read读取输入子系统数据的方式input_event()上报数据的实现过程evdev_open的实现过程应用程序中调用了输入子系统的代码,数据是如何传递给用户层的?open("/dev/event1", O_RDWR

2021-10-27 17:19:45 167

原创 4.输入子系统3

文章目录应用程序读取多个按键和驱动代码的结构分析输入子系统工作逻辑初识input三层的分析分层分析:应用是如何调用到输入子系统中去的open("/dev/event1", O_RDWR);vfs sys_open(); struct file file->f_ops = cdev->ops; file->f_ops->open();应用程序读取多个按键和驱动代码的结构分析#include <stdio.h>#include <string.

2021-10-27 15:08:39 255

原创 3.输入子系统2

文章目录input device的初始化解释添加input device的信息设置位表和上报数据的另一种方式设备树中定义按键信息的子节点初始化所有的按键并驱动起来input device的初始化解释3, 初始化input devicestruct input_dev {//表示的是一个具体的输入设备,描述设备能够产生什么数据const char *name; // sysfs中给用户看的信息const char *phys;const char *uniq;struct input_id id

2021-10-26 20:09:12 104

原创 2.输入子系统1

文章目录主要内容输入子系统的作用输入子系统的框架最简单的输入设备驱动程序编写输入子系统中硬件初始化和上报数据应用程序读取输入设备数据的方式主要内容主要内容:1,输入子系统的作用和框架2,输入子系统的编程方式–学会最简单的输入子系统的开发方式3,输入子系统和平台总线的结合编程方式—驱动所有按键4,输入子系统的工作原理和代码分析—学习内核的设计思想输入子系统的作用1,输入子系统的作用和框架什么是输入设备:1,按键/keyboard2, mouse3, touchscreen :gt811

2021-10-26 18:58:27 194

原创 1.高级驱动学习方法

文章目录字符设备驱动编写时引起的思考分层框架和面向对象的思想高级驱动学习特点和目标字符设备驱动编写时引起的思考linux字符设备驱动编程1,实现入口函数 xxx_init()和卸载函数 xxx_exit()2,申请设备号 register_chrdev_region (与内核相关)3,注册字符设备驱动 cdev_alloc cdev_init cdev_add (与内核相关)4,利用udev/mdev机制创建设备文件(节点) class_create, device_create (与内核

2021-10-21 09:15:06 242

原创 15.平台总线专题4

文章目录

2021-10-20 15:12:21 153

原创 14.平台总线专题3

文章目录平台总线作用和设计思想介绍平台总线中的三元素平台总线led驱动之资源的定义平台总线中driver实现的逻辑过程平台总线作用和设计思想介绍平台总线模型:为什么会有平台总线:用于平台升级:三星: 2410, 2440, 6410, s5pc100 s5pv210 4412硬件平台升级的时候,部分的模块的控制方式,基本上是类似的但是模块的地址是不一样 gpio控制逻辑: 1, 配置gpio的输入输出功能: gpxxconf 2, 给gpio的数据寄存器设置高低电平: g

2021-10-20 09:49:44 159

原创 13.平台总线专题2

文章目录device的构建和注册driver的构建和注册device的构建和注册device对象:设备对象,描述设备信息,包括地址,中断号,甚至其他自定义的数据struct device {struct kobject kobj;  //所有对象的父类const char *init_name;// 在总线中会有一个名字,用于做匹配,在/sys/bus/mybus/devices/名字struct bus_type *bus; //指向该device对象依附于总线的对象void *pla

2021-10-18 15:22:28 122

原创 11.中断编程5——按键驱动之异步信号实验、中断下半部tasklet实验、中断下半部工作队列实验

文章目录异步信号通知应用程序编程异步信号通知应用程序编程异步信号通知: 当有数据到时候,驱动会发送信号(SIGIO)给应用,就可以异步去读写数据,不用主动去读写a,应用–处理信号,主要是读写数据void catch_signale(int signo){if(signo == SIGIO){printf(“we got sigal SIGIO”);// 读取数据read(fd, &event, sizeof(struct key_event));if(event.code =

2021-10-18 10:37:03 322

原创 12.平台总线专题1

文章目录设备驱动模型的由来sysfs文件系统的介绍创建bus的代码编程设备驱动模型的由来字符设备驱动模型字符设备驱动模型中不太变化的有1,2,3,5,6;需要变化的有4.为了优化代码,可以把1,2,3,5,6和4分离出来,把动作部分(申请、映射、创建等动作)变成设备驱动对象,把静态部分(地址、中断)变成设备对象,这两部分通过总线对象串联起来。sysfs文件系统的介绍sys目录创建bus的代码编程构建自己的总线...

2021-10-15 10:07:15 134

原创 10.中断编程4——按键驱动之多路复用poll实现实验

文章目录多路复用select和poll的概念poll函数的使用介绍应用程序poll的编程方式有个问题poll驱动的实现完整代码多路复用select和poll的概念多路复用的使用场景:多个设备都可能有数据到来,可以使用多路复用select、poll进行监控各个fdpoll函数的使用介绍poll的应用:1, 需要打开多个文件(多个设备)2, 利用poll来实现监控fd的读,写,出错 #include <poll.h> int poll(struct pollfd *fds,

2021-10-12 15:38:53 334

原创 9.中断编程3——按键驱动之阻塞和非阻塞实验

文章目录阻塞的概念和接口使用阻塞的实现——等待队列的使用非阻塞模式的实现阻塞的概念和接口使用文件io模型:1,非阻塞2,阻塞3,多路复用–select/poll4, 异步信号通知faync阻塞: 当进程在读取外部设备的资源(数据),资源没有准备好,进程就会休眠 linux应用中,大部分的函数接口都是阻塞 scanf(); read(); write(); accept();驱动中需要调用 1,将当前进程加入到等待队列头中 add_wait_queue(wait_qu

2021-10-10 15:12:15 480

原创 8.中断编程2——按键驱动之获取按键数据实验

文章目录实现字符设备驱动框架驱动中获取硬件数据并传递给用户的方法用户获取按键数据的方式有个问题实现字符设备驱动框架1.设定一个全局的设备对象(全局)(init函数中)2.申请主设备号3.创建设备节点文件4.硬件的初始化——地址映射或者中断申请5.实现file_operations6.释放资源(exit函数中)驱动中获取硬件数据并传递给用户的方法a,硬件如何获取数据key: 按下和抬起: 1/0读取key对应的gpio的状态,可以判断按下还是抬起 读取key对应gpio的寄

2021-10-09 10:56:14 343

原创 7.中断编程1——按键驱动之申请中断实验

文章目录Linux中中断的概念和中断处理机制设备树文件中定义中断号驱动代码中获取中断号码的方法Linux中中断的概念和中断处理机制设备树文件中定义中断号1,中断号–就是一个号码,需要通过一定的方式去获取到在3.14.0内核中,从设备树中获取获取中断号到方法: 1, 宏定义 IRQ_EINT(号码) 2,设备树文件中 arch/arm/boot/dts/exynos4412-fs4412.dts硬件连接: key ---- gpx1_2--- EINT10设备树文件

2021-10-09 09:27:17 240

原创 6.字符设备驱动(下)

文章目录驱动和应用程序的设计思想字符设备驱动编写的步骤驱动中面向对象的设计思想做出错处理驱动和应用程序的设计思想应用程序和驱动扮演的是什么角色用户态:应用程序玩策略: 怎么去做1, 一闪一闪2,10s闪一次,也可以1s闪一次3,一直亮4,跑马灯控制权是在应用程序(程序员)--------------------------------------内核态:驱动玩机制: 能做什么led:亮 和 灭字符设备驱动编写的步骤步骤:1,实现模块加载和卸载入口函数module_init(

2021-10-08 14:23:18 173

原创 5.字符设备驱动基础(中)

文章目录应用控制驱动的方式用户空间和内核空间的数据交互地址映射ioremap的用法控制led灯的驱动代码实现应用控制驱动的方式应用程序如何去调用文件io去控制驱动–open,read,…//char_app_test.c#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main

2021-09-26 10:42:14 279

原创 4.字符设备驱动基础(上)

文章目录字符设备驱动框架申请设备号-register_chrdev接口字符设备驱动框架作为字符设备驱动要素:1,必须有一个设备号,用在众多到设备驱动中进行区分2,用户必须知道设备驱动对应到设备节点(设备文件)linux把所有到设备都看成文件 crw-r----- 1 root root 13, 64 Mar 28 20:14 event0 crw-r----- 1 root root 13, 65 Mar 28 20:14 event1 crw-r----- 1 root root

2021-09-24 15:03:23 232

原创 3.驱动模块开发(下)

文章目录最简单的hello驱动代码编写驱动Makefile编写最简单的hello驱动代码编写驱动代码编写分为4个部分:1,头文件2,驱动模块装载和卸载函数入口到声明3,实现模块装载和卸载函数入口4,GPL声明当ko文件加载到内核时调用装载函数当ko驱动文件从内核中卸载时会调用卸载函数//1.头文件#include <linux/init.h>#include <linux/module.h>//2.驱动模块装载和卸载函数入口到声明module_init(he

2021-09-23 14:57:47 247

原创 2.驱动模块开发(上)

文章目录编写驱动ko的准备工作内核的编译方法编写驱动ko的准备工作最终目标文件是uImage一部分可以在系统启动的时候就启动,比如要在系统启动的时候让LCD亮,就把LCD的驱动写到uImage里去;但是加载的驱动越多开机速度越慢,因此我们常用ko最终目标文件是ko时,适合在系统启动后再加载驱动,比如wifi内核的编译方法...

2021-09-17 11:30:14 136

原创 1.设备驱动环境搭建

文章目录交叉开发模式交叉开发模式在Ubuntu中用vim编写代码,用arm-none-…-gcc编译成arm上能用的可执行文件,给arm运行后有问题再在Ubuntu中修改编译,再交给arm运行,如此称为交叉开发模式。在arm的板子上首先要有linux系统,这就要先进行系统移植...

2021-09-16 18:37:31 133

原创 9.根文件系统移植

文章目录根文件系统根文件系统移植根文件系统bin、sbin、usr目录下都放着shell命令,其中的命令都有busybox编译生成,不能由Ubuntu复制,平台不同lib放的都是动态库,因为只要在执行的时候链接库就行,编译在Ubuntu中编译dev(设备)和proc(进程信息)和sys(驱动相关)都是空目录,因为等内核启动后会写入,这些称为虚拟文件系统。根文件系统移植详见:实验9 根文件系统移植.pdf工作中一般使用厂家提供的根文件系统。这里讲根文件系统只是为了解根文件系统是怎么来的。Bu

2021-09-13 15:42:59 180

原创 8.Linux设备驱动移植

文章目录设备树网卡驱动移植设备树比如要点亮LED2,将代码分为逻辑部分和设备部分(操作寄存器),逻辑部分归驱动管,设备部分归设备树管。如果还要点亮LED3,就只需修改设备树中的信息,而不用写冗余的重复代码。在Linux内核中arch/boot/dts文件夹中存放着设备树文件网卡驱动移植...

2021-08-27 07:57:55 442

原创 7.Linux内核移植

文章目录Linux内核概述Linux内核源码结构如何选择适应开发板的linuxLinux内核源码结构Linux内核的配置与编译Linux内核概述Linux内核源码结构如何选择适应开发板的linux一般问开发板厂商要配套的linux内核Linux内核源码结构Linux内核的配置与编译在arch/arm下可以看支持的arm的芯片...

2021-08-26 07:52:56 118

原创 6.uboot移植

文章目录uboot源码结构uboot的配置与编译配置编译uboot源码结构uboot的配置与编译配置配置:告诉uboot使用的是哪个开发板编译:生成.bin文件用来给开发板board_name:在board目录下找到相似的开发板名字这是uboot的顶层目录要运行在arm平台下,修改顶层目录下的Makefile如下:编译...

2021-08-23 10:58:30 148

原创 5.交叉编译工具链

文章目录交叉编译ELF文件格式交叉编译工具链常用工具交叉编译ELF文件格式在Windows系统,gcc编译完生成的文件是.exe格式的。在Linux系统,gcc编译完生成的文件是ELF格式的。交叉编译工具链常用工具诸如函数名会放在符号表中,对程序执行没有影响,可以用strip命令给程序瘦身,通过file命令可以查看一个文件是否瘦过身尽管符号表在程序执行中没有什么作用,但是如果别人给你一个类似.o的不可见代码的文件,可以通过nm命令查看有什么函数名,从而知道有什么功能。...

2021-08-20 11:54:22 328

原创 4.Linux内核安装与加载

文章目录tftp加载linux内核及rootfsEMMC加载Linux内核及rootfstftp加载linux内核及rootfs本次实验的目的就是通过tftp从Ubuntu中加载linux内核和根文件系统到内存中去运行。具体步骤见实验5 Linux内核的安装与加载.pdf根据4412的芯片手册的地址表可知:0x40000000~0xFFFFFFFF是内存的地址,可以存放从Ubuntu中加载的linux内核。由于实际内存是1G,因此有效内存地址是0x40000000 ~ 0x80000000.使

2021-08-19 09:45:37 464

原创 3.uboot烧写及使用

文章目录uboot概述SD卡启动盘制作SD卡存储结构SD卡启动盘制作uboot的使用uboot概述SD卡启动盘制作SD卡存储结构SD卡启动盘制作在uboot分区前增加zero.bin是为了给uboot腾出一个分区表扇区具体步骤见SD卡启动盘制作.pdfuboot的使用setenv ipaddr 192.168.1.100saveenv...

2021-08-17 08:44:15 319

原创 C++基础

文章目录第一个Helloworld注释变量常量数据类型整型sizeof关键字实型字符型转义字符字符串字符布尔类型数据的输入运算符程序流程结构if语句三目运算符switch语句for while循环语句跳转语句break\continue\goto数组一维数组二维数组函数分文件编写指针结构体C++核心编程内存分区new操作符第一个Helloworld打开VisualStudio,选择新建项目,空项目C++,输入项目名和保存路径,创建项目。在解决方案资源管理器中右键源文件,新建项,选择C++文件。#inc

2021-08-13 16:57:41 119

原创 1.嵌入式系统移植导学

文章目录系统移植导学系统移植过程开发板的启动过程系统移植导学系统移植就是在基于ARM处理器的开发板上安装Linux系统。学习重点:要掌握通用系统移植的方法,要会系统移植,细节不必细究,用到了再看就行。系统移植过程SD卡启动盘用uboot启动开发板的启动过程...

2021-08-11 10:37:30 386 2

原创 24.IIC编程

文章目录IIC编程IIC编程#include "exynos_4412.h"/****************MPU6050内部寄存器地址****************/#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)#define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)#de

2021-08-07 07:30:04 322

原创 23.IIC控制器和MPU6050

文章目录4412下的IIC控制器主机发送和接收的流程图IIC寄存器详解MPU6050原理MPU6050读写时序4412下的IIC控制器主机发送和接收的流程图IIC寄存器详解第一个寄存器:中断:当主机发送完一个数据或接收完一个数据要产生中断第二个寄存器其它寄存器MPU6050原理该芯片在CD卡旁边,标着U21MPU6050读写时序...

2021-08-06 15:07:32 452

原创 22.IIC总线原理

文章目录IIC总线简介IIC总线通信过程IIC总线简介IIC总线通信过程第2步,主机发送一个字节数据指明从机地址(7位),和后续字节的传送方向(第0位是0表示主机给从机发送,是1表示从机给主机发送)第4、5步的发送器和接收器指的是第2步中指明的发送方向后主动发送数据的一方和被动接收的一方...

2021-08-05 10:24:29 427

原创 21.PWM实验

文章目录蜂鸣器的工作原理什么是PWM蜂鸣器的工作原理有源蜂鸣器:高电平响,低电平不响。一般使用GPIO来控制给高低电平。无源蜂鸣器:加交变电流后,高低电平频繁变化,高电平时线圈接通电生磁,吸引永磁铁,低电平时无电生磁,排斥永磁铁,以此产生永磁铁的振动,当振动频率在20-20000Hz之间人耳能听到声音。什么是PWM通过Delay和GPIO的控制产生高低电平,由于CPU主要去执行Delay函数,太耗资源,因此我们使用PWM的方式去产生高低电平。PWM在SOC上,由PWM生产高低电平信号而不用使

2021-08-02 15:56:08 1197

原创 20.RTC实验

文章目录RTC简介4412下的RTC控制器RTC寄存器详解RTC编程RTC简介4412下的RTC控制器BCD码:用四位二进制数表示一位十进制数。alarm:闹铃功能。当设置的闹铃预期时间与实际时间相等,激发闹铃功能。原理简述:晶振通过分频器分频后降到1Hz,即1秒输入信号1次,信号给秒寄存器做累加,当累加到60给分寄存器发信号让其累加,当分寄存器累加到60给小时寄存器发信号,其会累加,以此类推实现实时时钟。RTC寄存器详解用BCD数表示则000000100011表示023,四位二进制表

2021-07-30 09:23:43 570

空空如也

空空如也

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

TA关注的人

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