itop-4412 Linux driver
1、该专栏是学习了itop4412的驱动视频后,自己总结的笔记,记录了整个驱动的循序渐进的学习过程。
2、itop的驱动教程中的IIC和SPI部分还需要学习,才可以基本上明白。
3、linux驱动的视频是一个比较难的东西,可以免费提供给测试源码,环境讨论交流一起学习进步。
zxy131072
嵌入式linux
展开
-
036_mylist
一、驱动测试源码mylist.c#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/slab.h>#include <linux/list.h>#define STU_NUM 5MODU...原创 2020-03-26 13:16:12 · 210 阅读 · 0 评论 -
035_platform_led
一、驱动测试源码platform_led_device.c#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/platform_device.h>MODU...原创 2020-03-26 12:19:23 · 163 阅读 · 0 评论 -
034_platform平台总线
一、驱动测试源码platform_device_final.c#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/platform_device.h>MO...原创 2020-03-26 09:22:17 · 152 阅读 · 0 评论 -
001_内核源码文件
一、源码目录结构1、迅为iTOP-4412 的平台文件,是arch→arm→mach-exynos→mach-itop4412.c。2、arch→arm→boot 目录,默认编译生成的内核镜像是在这个目录下。二、基础知识1、名词解释:gccgcc是linux系统下主要的编译软件,gcc的全称是GNU...原创 2019-08-24 10:39:11 · 156 阅读 · 0 评论 -
002_最简单的linux驱动模块
一、Ubuntu系统下的Vim编辑器无法显示中文字符1、打开文件“/etc/vim/vimrc”2、在最底部添加代码set fencs=utf-8,GB18030,ucs-bom,default,latin1二、最小linux驱动模板mini_linux_module.c#include <linux/init.h>#include <linux/module....原创 2019-08-24 10:48:01 · 174 阅读 · 0 评论 -
003_menuconfig Makefile 等文件的关系
一、.config Kconfig Makefile menuconfig关系1、Kconfig2、menuconfig3、Makefile4、.configLinux编译器通过.config文件确认哪些代码编译进内核,哪些被裁减掉。menuconfig是生成.config的一个工具,menuconfig实现的代码在源码的scripts目录下。Makefile用来定义哪些内容作为模块...原创 2019-08-24 10:59:30 · 297 阅读 · 0 评论 -
004_Makefile的编译
一、向内核中添加驱动步骤在向内核中添加驱动的时候要完成3 项工作,包括:1、在Kconfig 中添加新代码对应项目的编译条件2、将驱动源码添加到对应的目录中3、在目录Makefile 中文件中增加针对新代码的编译条目二、编译器路径的设置1、打开家目录下的.bashrc文件,在其最下面添加如下内容:export PATH=$PATH:/home/mint/itop/arm-2009...原创 2019-08-24 11:35:57 · 650 阅读 · 0 评论 -
005_总线、设备和驱动注册流程
在Linux2.6 之后,Linux 设备驱动分为三个实体总线、设备、驱动,平台总线将设备和驱动匹配。在系统注册任意一个驱动的时候,都会寻找对应的设备;当系统注册设备的时候,系统也会寻找对应的驱动进行匹配。一、总线、设备和驱动关系图Linux 创立了一种虚拟总线,也叫平台总线或者platform 总线,这个总线也有对应的设备platform_device,对应的驱动叫platform_d...原创 2019-08-24 11:42:26 · 325 阅读 · 0 评论 -
006_注册设备
一、在虚拟平台platform总线上注册设备1、platform_device结构体(1)位置 源码目录下的include/linux/platform_device.h中。(2)代码struct platform_device { const char * name;//设备的名称,在/sys/devices中会显示 int id; //设备的id,用于插入总线并且具有相...原创 2019-09-05 15:49:53 · 199 阅读 · 0 评论 -
007_驱动注册
一、相关函数 platform_driver_register 和platform_driver_unregister 函数platform_driver_register 函数和platform_driver_unregister 函数用于注册和卸载驱动。1、在源码目录下的 include/linux/platform_device.h文件中。extern int platform_dri...原创 2019-09-05 15:56:14 · 224 阅读 · 0 评论 -
008_生成设备节点
一、杂项设备介绍杂项设备的主设备号是10,在任何Linux 系统中它都是固定的。杂项设备的引入既解决了设备号数量少的问题,又降低了使用难度,还能防止碎片化,一举多得。杂项设备是被强制编译至内核中的。obj-y += misc.o二、杂项设备注册函数以及结构体1、位置:杂项设备的头文件在源码目录下的 include/l...原创 2019-09-05 16:06:47 · 182 阅读 · 0 评论 -
009_编写简单应用调用驱动
一、调用skyfall_ctl123设备节点1、测试代码 skyfall_ctl.c #include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd...原创 2019-09-05 16:14:22 · 169 阅读 · 0 评论 -
010_驱动硬件基础
一、sch原理图工程师1、 方案设计2、元器件选型3、采购(能不能买到,价格)4、 原理图(涉及到稳定性)二、 layout工程师1、元器件 layout(封装、布局,布线,log)(涉及到稳定性)2、焊接的一部分工作(调试阶段板子的焊接)三、驱动工程师编写驱动程序,测试模块的功能...原创 2019-09-05 16:44:49 · 142 阅读 · 0 评论 -
011_GPIO的初始化
一、GPIO的初始化在内核源码目录下 ls drivers/gpio/*.o, 可以看到 gpioexynos4.c源文件最终被编译进了内核。生成.o文件代表最终被编译进了内核除了menuconfig配置文件,还可以通过.o文件来判定该文件是否编译进了内核在 gpio-exynos4.c 文件最下面一行 core_initcall(exynos4_gpiolib_init);c...原创 2019-09-24 17:25:22 · 679 阅读 · 0 评论 -
012_LED驱动
一、开发板LED驱动硬件部分/*led的两个IO,网络是KP_COL0,VDD50_EN*/KP_COL0 GPL2_0VDD50_EN GPK1_1当为高电平时,对应的LED被点亮。二、LED管脚的调用、赋值以及配置1、GPIO 申请函数(1)头文件 include/linux/gpio.h(2)函数static inline int g...原创 2019-09-24 17:35:16 · 359 阅读 · 0 评论 -
013_itop4412设置多个GPIO
一、去掉占用GPIO的驱动包括 leds,buzzer,camera ov5640,WIFI/*led的两个IO,网络是KP_COL0,VDD50_EN*//*蜂鸣器的1个IO,网络是MOTOR_PWM*//*矩阵键盘的8个IO,网络是CHG_FLT,HOOK_DET,CHG_UOK,XEINT14_BAK,GM_INT1,6260_GPIO1,CHG_COK,XEINT29/KP_R...原创 2019-09-24 17:44:55 · 908 阅读 · 0 评论 -
014_驱动模块传参数
一、驱动模块传参数1、传单个参数(1)位置:在源码目录下的 include/linux/moduleparam.h 中(2)函数原型/** * module_param - typesafe helper for a module/cmdline parameter * @value: the variable to alter, and exposed parameter nam...原创 2019-09-24 17:50:06 · 196 阅读 · 0 评论 -
015_静态申请字符类设备号
一、申请字符类设备的函数1、位置: 字符设备函数在源码目录下的 include/linux/fs.h 中。2、函数原型 extern int register_chrdev_region(dev_t, unsigned, const char *);3、参数宏定义MKDEV的头文件 include/linux/kdev_t.h在kdev_t.h头文件中有一系列设备号处理...原创 2019-09-24 17:54:13 · 155 阅读 · 0 评论 -
016_Linux驱动Makefile支持在X86平台和ARM平台编译模板
废话不说,直接上模板#!/bin/bash$(warning KERNELRELEASE = $(KERNELRELEASE))ifeq ($(KERNELRELEASE),)ifeq ($(PLATFORM),PC)#内核的源码路径, ?= 条件赋值, uname -r 得到内核版本号KERNELDIR ?= /lib/modules/$(shell uname -r)/bui...原创 2019-09-25 15:12:06 · 714 阅读 · 0 评论 -
017_linux内核导出符号
一、导出模块的源码export_module.c#include <linux/kernel.h>#include <linux/init.h>#include <linux/module.h>#define __DEBUG__ #ifdef __DEBUG__ #define DEBUG(format,...) print...原创 2019-09-25 14:28:28 · 197 阅读 · 0 评论 -
018_printk打印级别
cat /proc/sys/kernel/printk参数解释:(1)第一个参数4 ============== 小于4优先级消息才会被输出到控制台。(2)第二个参数4 ============== 表示默认的printk消息优先级别,即printk(“hell world”);优先级为4, 由于4<7,故可以被打印到控制台。(3)第三个参数1 ==============...原创 2019-09-25 16:15:21 · 220 阅读 · 0 评论 -
019_动态申请字符类设备号
一、动态申请字符类设备号1、函数原型 extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *);2、参数dev_t *,存放返回的设备号unsigned,一般为0unsigned,次设备号连续编号范围const char *,设备名称3、返回值成功:0失败:-1 字符设备函数在...原创 2019-09-30 09:16:44 · 145 阅读 · 0 评论 -
020_注册字符类设备
一、分配内存空间1、位置:源码目录下 include/linux/slab.h2、函数原型/** * kzalloc - allocate memory. The memory is set to zero. * @size: how many bytes of memory are required. * @flags: the type of memory to allocat...原创 2019-09-30 09:26:11 · 125 阅读 · 0 评论 -
021_生成字符类设备节点
一、创建设备类Linux 中的class 是设备类,它是一个抽象的概念,没有对应的实体。它是提供给用户接口相似的一类设备的集合。常见的有输入子系统input、usb、串口tty、块设备block 等。1、创建设备类的函数class_create(1)位置 源码目录下 include/linux/device.h(2)函数原型/* This is a #define to keep ...原创 2019-09-30 09:33:33 · 182 阅读 · 0 评论 -
022_字符驱动
一、框架注册字符设备驱动的框架是 一步一步过来的,需要参考前面的例子,一步一个脚印走过来。二、驱动层测试1、char_dev_driver.c/*包含初始化宏定义的头文件,代码中的module_init和module_exit在此文件中*/#include <linux/init.h>/*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*/...原创 2019-09-30 09:40:02 · 116 阅读 · 0 评论 -
023_file_operations结构体
file_operations中的函数**1、int (*open) (struct inode *, struct file *) 打开函数 2、int (*release) (struct inode *, struct file *) 释放函数 3、long (*unlocked_ioctl) (struct file *, unsigned int, un...原创 2019-09-30 09:44:04 · 242 阅读 · 0 评论 -
024_porc文件系统
在linux系统中,proc文件系统用于导出内核的信息。proc文件系统一般是只读,也是可以通过编写代码给proc中添加信息。 cat /proc/meminfo常用参数:– MemTotal:总内存– MemFree:空闲内存– Cached:缓存– Active:活跃内存– Inactive:非活跃内存 cat /proc/cpuinfo常用参数– ...原创 2019-09-30 09:53:02 · 169 阅读 · 0 评论 -
025_GPIO的读
一、利用拨码开关来实现GPIO的输入拨码开关的3和4,原理图如下: AP_SLEEP→GPC0_3→EXYNOS4_GPC0(3) XEINT6→GPX0_6→EXYNOS4_GPX0(6)**向内是低电平,输入0;向外是高电平1.8v,输入1。** 分析寄存器,需要设置: 1、设置为输入 2、读寄存器 3、不上拉,不下拉二、GPIO的输入需要的函数1、...原创 2019-09-30 10:05:23 · 306 阅读 · 0 评论 -
026_地址方式控制LED
一、物理地址与虚拟地址的映射读写GPIO,控制GPIO的寄存器都是使用系统做好的虚拟地址,ioremap和iounmap函数可以实现物理地址到虚拟地址的转化。二、LED2的硬件配置KP_COL0→GPL2_0查看三星的数据手册:GPL2CON,GPL2DAT,GPL2PUDAddress = Base Address+OffsetGPL2CON = 0x1100_0000 +...原创 2019-09-30 10:15:32 · 402 阅读 · 0 评论 -
027_并发控制
一、并发的基本概念1、并发**多个执行单元同时、并行被执行。Linux系统是多任务的,很多任务会同时执行。假如有三个执行单元ABC,共享了内存资源。执行单元A对Buffer写1000个“a”;执行单元B对Buffer写1000个“b”;执行单元C从buffer中读取数据。如果按照A写→C读→B写→C读,当然没有问题。但是如果A写→B写→C读,执行单元C就出问题了。当然比这个复杂更多,更加...原创 2019-09-30 10:36:22 · 156 阅读 · 0 评论 -
028_查询方式读取按键值
一、原理分析**按键会影响电平的输入,通过GPIO的输入电平来检测按键的变化。**二、硬件环境 **使用两个按键:Home和Back Home-------------UART_RING → GPX1_1 Back---------------SIM_DET → GPX1_2 EXYNOS4_GPX1(1),EXYNOS4_GPX1(2)**三、软件环境1、在...原创 2019-09-30 10:45:54 · 598 阅读 · 0 评论 -
029_中断注册
一、独立按键的中断例程按键按下(产生了中断)--------》跳转到异常向量入口,执行中断函数。中断函数要做的工作:1、保护现场2、执行中断处理函数3、恢复现场二、中断注册和释放函数request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, voi...原创 2019-09-30 10:56:46 · 230 阅读 · 0 评论 -
030_4412上的PWM
一、PWM波**PWM = 定时器+定时器中断(重载)+IO输出(翻转)**二、分析原理图GPIO-GPD0_0XpwmTOUT0 定时器0三、PWM定时器上的资源1、5个32位定时器2、定时器会产生内部中断3、定时器0、1、2、3可以通过编程实现PWM4、定时器都有各自对应的分频5、TCNTBn–,TCNTBn=TCMPBnGPD0_0设置为pwm输出GPD...原创 2019-09-30 11:03:21 · 314 阅读 · 0 评论 -
031_Linux驱动下的RS485总线
一、RS485硬件原理差分对传输数据的原理,IO数据的传输-------》差分对。RS232传输的距离在15米以下,RS485传输距离是几十米到1000米以上。为什么485可以传输这么远?差分对的机制可以降低电磁场的干扰、衰减。485传输距离和传输线有关系 注意:双绞线和屏蔽线。485原理图:嵌入式上一般使用串口转485 串口的信号转化为485:D→(A,B)DE高...原创 2019-09-30 11:16:22 · 5570 阅读 · 4 评论 -
032_定时器
一、Linux定时器基础知识**定时器的使用范围(延后执行某个操作,定时查询某个状态;前提是对时间要求不高的地方)HZ:(系统时钟通过CONFIG_HZ来设置,范围是100-1000;HZ决定时钟中断发生的频率)内核的全局变量jiffies:(记录内核自启动来的节拍数,内核自启动以来,产生的中断数) jiffies/HZ 内核自启动以来的秒数。**二、内核定时器的例程结构体ti...原创 2019-09-30 11:27:01 · 113 阅读 · 0 评论 -
033_linux下的I2C驱动_基于设备树
平台介绍硬件环境 1、itop4412精英版 2、自购的一个mpu6050模块软件环境 1、宿主机:mint19.02系统 2、迅为提供的基于设备树的linux4.14.02内核源码,使用的迅为教程中新的linux4.14内核。 3、迅为提供的可以使用设备树的uboot 4、使用4.14内核下编译成功的设备树文件。 5、根文件系统使用busybox制作,系统运行没有问题。...原创 2019-10-20 10:01:45 · 1023 阅读 · 0 评论