![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux 驱动
dachunfree
冰冻三尺,非一日之寒
展开
-
le32_to_cpu 和cpu_to_le32 大小断对齐
A53 是大端对齐的,但是其中一个spi的slave是小端对齐的。看一下 le32_to_cpu 的实现:/* little_endian.h */#define __cpu_to_le32(x) ((__force __le32)(__u32)(x))#define __le32_to_cpu(x) ((__force __u32)(__le32)(x))/*big_endian.h*/#define __le32_to_cpu(x) __swab32((__force __u3原创 2022-01-13 14:18:37 · 1020 阅读 · 0 评论 -
DEVICE_ATTR
使用DEVICE_ATTR,可以在sys fs中添加“文件”,通过修改该文件内容,可以实现在运行过程中动态控制device的目的。这样方便用户空间调试。#include <linux/kernel.h>#include <linux/init.h>#include <linux/module.h>#include <linux/slab.h...原创 2019-11-21 17:11:43 · 127 阅读 · 0 评论 -
i2c_register_driver
打开打印后,如下:1. bus: 'i2c': add driver at242. bus: 'i2c': driver_probe_device: matched device 0-0056 with driver at243. bus: 'i2c': really_probe: probing driver at24 with device 0-00564. at24 0-0056:...原创 2019-11-18 16:10:11 · 466 阅读 · 0 评论 -
linux 之i2c 24FC256驱动
基于zynq平台调试 24FC256驱动。需要注意的是此款eeprom是32K x 8 (256 Kbit)。为了支持此款eeprom的寻址范围,地址需要16位来表示。 1.先看此款eeprom的设备地址。 a0,a1,a2,三根线可以选择设备的地址为多少。我们靠硬件把地址设置为0x56(0b10101...原创 2019-11-15 16:47:03 · 452 阅读 · 0 评论 -
看门狗不断复位
最近遇到一个问题,在zynq上跑起linux 4.4的kernel出现如下状况:板子出现死机,在串口上无法敲命令,最后60s后被watchdog 复位。这个状况出现频率不固定。/*****************************************************************************/请教了一个kernel大神,初步怀疑是deadlock。...原创 2018-09-17 11:29:41 · 4962 阅读 · 0 评论 -
linux reserved memory用法
主要做项目时候,需要分配一块连续的大的物理内存。1.kmalloc 不能分配那么大。2.alloc_pages MAX_ORDER为11,也就是最大分配2的11次方的页。reserverd memory在最开始时候分配好,这块内存不会再分配给kernel用。主要更改devicetree。 memory { device_type = "memory"; ...原创 2018-10-09 19:24:49 · 7642 阅读 · 1 评论 -
中断处理流程
以s3c2440为例讲述,中断处理流程:1.开中断。产生外部中断。流程如下按键----->中断控制器------->cpu(总开关)* 按键:需要设置GPIO为中断模式,上升沿还是下降沿触发。* 中断控制器:* cpu:2.中断处理* 跳转到中断向量表。如果从nandflash启动,代码已经重定位到sdram,此时候是绝对跳转,会跳转的真正的0地址(...原创 2018-10-25 17:19:01 · 2500 阅读 · 0 评论 -
nandflash linux 驱动
上一节讲述了nandfalsh的硬件时序图和基本的操作,本节分析一下nandfalsh的驱动。首先看下驱动的代码:你会发现和norflash的驱动非常像,其实就是实现了最基本的操作,读,写,擦除命令。然后递交给MTD。struct s3c_nand_regs { unsigned long nfconf ; unsigned long nfcont ; unsigned lon...原创 2018-11-06 15:26:43 · 150 阅读 · 0 评论 -
norflash linux 驱动
上一节已经了解了norfalsh的用法。这一节熟悉下norflash(xip结构)的用法。 首先看下图,MTD层已经帮我们做好了如何擦除falsh,怎么读flash,怎么写flash。我们写驱动主要就是告诉kernel,我们的norfalsh相关信息,来匹配MTD层函数。 块设备怎么读写,比如应用层open,write后发生什么,主要就是通过文件系统调用了ll...原创 2018-11-04 21:32:45 · 352 阅读 · 0 评论 -
linux 内核 内存管理 slub算法 (一) 原理
https://blog.csdn.net/lukuen/article/details/6935068 内核管理页面使用了2个算法:伙伴算法和slub算法,伙伴算法以页为单位管理内存,但在大多数情况下,程序需要的并不是一整页,而是几个、几十个字节的小内存。于是需要另外一套系统来完成对小内存的管理,这就是slub系统。slub系统运行在伙伴系统之上,为内核提供小内存管理的功能。...转载 2019-02-12 19:24:00 · 225 阅读 · 0 评论 -
initcall 机制
1.pa的pinctrl申请及初始化pa_init(np); nufront_sta_of_probe nufront_sta_init 2.驱动注册late_initcall(nufront_sta_init); #define late_initcall(fn) __define_initcall(fn, 7) #define __define_initcall(f...原创 2019-06-10 09:56:41 · 164 阅读 · 0 评论 -
arm-linux-gcc安装
网上一大堆arm-linux-gcc下载的网盘和链接都被清理了,并不能用,去gun官网找,找了半天也很麻烦,本人终于安装成功,成果共享。方法一:使用如下命令进行arm-linux-gcc的安装:sudo apt-get install gcc-arm-linux-gnueabihf使用如下命令进行arm-linux-g++的安装:sudo apt-get install g++...转载 2018-08-06 09:46:45 · 1294 阅读 · 0 评论 -
linux 中断上下文与进程上下文【转】
1、特权级 Intel x86架构的cpu一共有0~4四个特权级,0级最高,3级最低,ARM架构也有不同的特权级,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查。硬件已经提供了一套特权级使用的相关机制,软件自然要好好利用,这属于操作系统要做的事情,对于UNIX/LINUX来说,只使用了0级特权级别和3级特权级,即最高最低特权级。也就是说在UNIX/LINUX系统中,一条工作在...转载 2018-06-20 14:33:01 · 415 阅读 · 0 评论 -
linux 定时器
#include#include#include#includeMODULE_LICENSE("Dual BSD/GPL");#if 0struct time_list{ unsigned long expires; void (*funcation)(unsigned long) unsigned long data;};#endi原创 2018-02-03 13:53:22 · 186 阅读 · 0 评论 -
Linux内核定时器
本文章摘自一下几位网友。http://blog.sina.com.cn/s/blog_57330c3401011cq3.html https://www.cnblogs.com/hjj801006/p/4551378.htmlLinux的内核中定义了一个定时器的结构:#include<linux/timer.h>struct timer_list { struct list_...转载 2018-05-11 09:13:05 · 206 阅读 · 0 评论 -
linux char驱动总结
#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/delay.h>#include <linux/irq.h>#include <asm/u...原创 2018-05-11 17:10:01 · 546 阅读 · 0 评论 -
input子系统——kernel中input设备介绍
一、输入子系统驱动层分析 在键盘驱动代码分析的笔记中,接触到了input子系统,键盘驱动,键盘驱动将检测到的所有按键都上报给了input子系统。Input子系统是所有I/O设备驱动的中间层,为上层提供了一个统一的界面。例如,在终端系统中,我们不需要去管有多少个键盘,多少个鼠标。它只要从input子系统中去取对应的事件(按键,鼠标移位等)就可以了。今天就对input子系统做一个详尽的分析。 ...转载 2018-05-14 15:36:53 · 692 阅读 · 0 评论 -
linux 块设备驱动
首先需要了解下块设备驱动和字符设备驱动区别:1.字符设备驱动都是以字节流的形式,而块设备驱动是以块读写和操作(比如磁盘是扇区,flash是page为单位)2.字符设备app可以直接读写,简单快捷。块设备驱动需要中间实现一个buffer 队列,然后实现调度算法(合并,调整顺序等)磁盘例子:先读后写,调整了顺序。2. flash 会合并下两个操作。具体流程如下图所示,app开始对磁盘读写时候,首先会进...原创 2018-06-06 15:45:35 · 1199 阅读 · 0 评论 -
linux 块驱动【转】
Linux操作系统有两类主要的设备文件:1.字符设备:以字节为单位进行顺序I/O操作的设备,无需缓冲区且被直接读写。2.块设备:只能以块单位接收输入返回,对于I/O请求有对应的缓冲区,可以随机访问,块设备的访问位置必须能够在介质的不同区间前后移动。在块设备中,最小的可寻址单元是扇区,扇区的大小一般是2的整数倍,常见的大小为512个字节。 上图是一个块设备操作的分层实现图1.当...转载 2018-06-06 16:32:55 · 419 阅读 · 0 评论 -
Linux内核多线程实现方法 —— kthread_create函数
转:https://blog.csdn.net/sharecode/article/details/40076951Linux内核多线程实现方法 —— kthread_create函数 内核经常需要在后台执行一些操作,这种任务就可以通过内核线程(kernle thread)完成独立运行在内核空间的标准进程。内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm指针被设置为NULL;它只...转载 2018-05-31 17:28:21 · 610 阅读 · 0 评论 -
kthread
要创建一个内核线程有许多种方法,我们这里要学的是最简单的一种。打开include/linux/kthread.h,你就看到了它全部的API,一共三个函数。 struct task_struct kthread_run((*threadfn)(void *data), void *data, const char namefmt[],...); int kthread_stop(stru...转载 2018-05-31 19:10:34 · 1387 阅读 · 0 评论 -
Linux进程的睡眠和唤醒简析【转】
1 Linux进程的睡眠和唤醒在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行。当然,一个进程也可以主动释放CPU的控制权。函数 schedule()是一个调度函数,它可以被...转载 2018-06-07 17:29:52 · 472 阅读 · 0 评论 -
linux poll 机制【转】
http://blog.chinaunix.net/uid-22278460-id-1777659.html所有的系统调用,基于都可以在它的名字前加上“sys_”前缀,这就是它在内核中对应的函数。比如系统调用open、read、write、poll,与之对应的内核函数为:sys_open、sys_read、sys_write、sys_poll。一、内核框架:对于系统调用poll或select,它们...转载 2018-06-26 16:45:19 · 142 阅读 · 0 评论 -
Linux设备驱动中断机制
出自:http://www.cnblogs.com/chen-farsight/p/6155503.html【主要内容】Linux设备驱动编程中的中断与定时器处理【正文】一、基础知识1、中断所谓中断是指CPU在执行程序的过程中,出现了某些突发事件急待处理,CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回程序被中断转载 2018-01-25 16:01:34 · 157 阅读 · 0 评论