- 博客(356)
- 资源 (4)
- 收藏
- 关注
原创 pl330 dmac驱动分析1--数据结构
pl330 dmac是基于arm amba的dma控制器,最多有8个操作通道,32个事件处理,并且有多个外设接口,有自己的命令集,详细信息看pl330 datesheet。pl330驱动程序: pl330驱动程序位于看kernel/driver/dma/pl330.c文件,该驱动程序由三星coder写的。 驱动的关键数据结构:
2017-02-04 16:32:41
4165
1
原创 linux rculist代码分析
linux内核rcu机制,是在多读线程和一个写线程并发情况下对指针的保户机制,多写并发需要加锁。常应用于链表的数据操作中。linux内核rculist.h是对链表带rcu保护机制操作函数的实现和封装,位于kernel/include/linux/ruclist.h下面介绍rculist中的函数或宏1、list_next/* * return the ->next point
2016-09-30 17:13:48
1957
原创 linux i2c子系统代码分析9---i2c设备的注册方法
i2c设备注册方法有:1、板级代码初始化时i2c board info注册进链表,后面i2c适配器注册时扫描链表,将i2c设备注册到总线。2、i2c内核模块动态加载,在内核模块中用i2c_new_device和 i2c_new_probed_device函数注册i2c设备,两者区别是i2c_new_device根据提供的i2c board info注册设备,i2c_new_probed_dev
2016-09-13 14:56:23
1050
1
转载 linux内核编译Kconfig总结
linux内核make menuconfig生成.config时,会调用GUI配置工具,这个GUI配置工具具体调用的就是内核各目录下的Kconfig文件,Kconfig文件层次结构和各内核目录中层次相似,最终形成GUI的各级配置菜单。下面首先介绍Kconfig文件规则:Kconfig文件的基本要素:1.config条目(entry) config TMPFS_POSIX_AC
2016-09-13 10:34:05
3004
原创 linux i2c子系统代码分析7 ---i2c适配器注册时机、方法以及例程
i2c适配器注册时机:1、在paltform驱动中注册,在板级初始化时注册一个platform设备,然后在注册platform驱动时将i2c适配器注册。这种方法属于适配器静态注册,是soc中i2c适配器通用注册方法,因为这样保证后续的i2c驱动注册以及i2c设备注册能找到匹配的适配器,i2c驱动和i2c设备注册在i2c适配器注册之后。2、加载一个内核模块,在模块中完成i2c适配器注册,
2016-09-06 11:08:48
800
原创 linux i2c子系统代码分析8 ---i2c子系统内核目录介绍
i2c子系统核心目录在kernel/driver/linux/i2c,i2c核心头文件在kernel/include/linux/i2c.h在kernel/driver/linux/i2c中:i2c-core.c是包含i2c适配器、i2c驱动、i2c设备注册、注销以及i2c数据处理函数等核心操作的文件。i2c-boardinfo.c是i2c静态声明i2c设备的文件i2c-dev.c
2016-09-05 17:05:10
731
原创 linux i2c子系统代码分析6 ---操作函数i2c数据处理函数
下面介绍i2c的数据处理函数1、 i2c_master_send 在主模式下发送一个信息kernel/driver/linux/i2c/i2c-core.c/** * i2c_master_send - issue a single I2C message in master transmit mode * @client: Handle to slave
2016-09-05 14:27:23
1249
原创 linux i2c子系统代码分析5 ---操作函数i2c_new_device i2c_new_probed_device i2c_register_board_info介绍
下面介绍i2c设备操作相关函数1、kernel/driver/linux/i2c/i2c-core.cstruct i2c_client *i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) i2c适配器静态增加新i2c设备,根据 i2c_board_info 静态设备声明
2016-09-05 13:08:20
4990
原创 linux i2c子系统代码分析4 ---操作函数i2c_add_driver i2c_register_driver介绍
下面介绍 i2c 驱动相关操作函数i2c_add_driverkernel/include/linux/i2c.hstatic inline int i2c_add_driver(struct i2c_driver *driver){return i2c_register_driver(THIS_MODULE, driver);} i2c_add_driver
2016-09-05 10:32:10
4469
原创 linux i2c子系统代码分析3 ---操作函数i2c_add_adapter i2c_add_numbered_adapter介绍
二.i2c子系统操作函数,i2c-core.ckernel/driver/linux/i2c/i2c-core.c/** * i2c_add_adapter - declare i2c adapter, use dynamic bus number * @adapter: the adapter to add * Context: can sleep * *
2016-09-03 17:56:28
3669
原创 linux i2c子系统代码分析2 ---操作函数i2c_init介绍
2.i2c子系统操作函数,i2c-core.c上面介绍了i2c子系统重要的数据结构,下面介绍i2c子系统的适配器、算法、设备、设备驱动注册、注销以及重要的数据处理函数在kernel/driver/linux/i2c/i2c-core.c文件中static int __init i2c_init(void){int retval;retval
2016-09-03 13:56:14
1939
原创 linux i2c子系统代码分析1 ---概述以及主要数据结构
概述:i2c是很流行的串行半双工通信协议,主从架构。linux 中有关于i2c子系统的实现支持,其和平台无关的,具体实现需要驱动工程师自己实现。linux i2c中核心代码是i2c-core.c 其有i2c适配器、i2c算法、i2c驱动以及i2c设备注册、注销以及数据处理的实现。再介绍下i2c子系统各部分的关系:i2c适配器是设备,是i2c具体外设(外部或芯片内部)的抽象,i2c算
2016-09-03 13:46:10
1064
转载 linux中关于原子操作
原子操作:就是在执行某一操作时不被打断。linux原子操作问题来源于进程的抢占以及多核smp系统中程序的并发执行。对于临界区的操作可以加锁来保证原子性,对于全局变量或静态变量操作则需要依赖于硬件平台的原子变量操作。因此原子操作有两类:一类是各种临界区的锁,一类是操作原子变量的函数。对于arm来说,单核每条汇编指令都是原子的,多核smp也是,因为有总线仲裁所以cpu可以单独占用总线直
2016-08-02 15:32:55
13593
转载 linux kernel的中断子系统:GIC代码分析
一、前言GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1~V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构)。目前在ARM官方网站只能下载到Version 2的GIC architecture sp
2016-07-26 23:12:10
769
转载 linux内核自旋锁总结
1、自旋锁实现:自旋锁是一个互斥设备,它只有两个值:“锁定”和“解锁”。它通常实现为某个整数值中的某个位。希望获得某个特定锁得代码测试相关的位。如果锁可用,则“锁定”被设置,而代码继续进入临界区;相反,如果锁被其他人获得,则代码进入忙循环(而不是休眠,这也是自旋锁和一般锁的区别)并重复检查这个锁,直到该锁可用为止,这就是自旋的过程。“测试并设置位”的操作必须是原子的,多线程并发获取锁时所做
2016-07-06 16:29:52
2803
原创 linux 时间函数总结
首先了解关于时间的一些概念:UTC:协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT,本地时间是基于其的差值本地时间:本地时间是utc时间和本地时区的差值日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来 说,这个标准时间点是不变的,该编译
2016-06-16 09:49:13
656
原创 hi3531 uboot phy调试总结
首先调试检查硬件,再调试软件首先仔细阅读phy和主芯片datesheet 硬件注意:关于phy的芯片需要注意的有几点:1、mdio接口和rgmii或者mii接口是否正确。2、电源是否稳定,晶振是否起振并且频率匹配。3、phy地址的配置是否正确,不能是0地址,因为0地址默认是所以芯片的地址。4、phy芯片输出时钟是否正确。4、phy和主芯片rgmii接口电平是否匹配。关于主芯片mac
2016-06-16 09:46:09
17756
2
转载 linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解
1、特权级 Intel x86架构的cpu一共有0~4四个特权级,0级最高,3级最低,ARM架构也有不同的特权级,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查。硬件已经提供了一套特权级使用的相关机制,软件自然要好好利用,这属于操作系统要做的事情,对于UNIX/LINUX来说,只使用了0级特权级别和3级特权级。也就是说在UNIX/LINUX系统中,一条工作
2016-06-13 17:45:29
10217
1
原创 linux shell环境变量总结
用户登录时就是打开一个shell进程,其会加载profile和bashrc文件中的变量,其变量就是环境变量,是所有其子进程全局变量。所以每次登陆一个终端都是重新打开一个shell进程,会重新加载环境变量,因此之前设置的环境变量都会失效。当在此shell下打开一个shell脚本时就是重新打开一个shell进程,其可以继承父进程的全局变量,也可以修改一个全局变量,但是只有其子shell
2016-05-28 13:52:51
3569
原创 hi3531 添加uart3
基于设备总线驱动模型在hi3531的linux内核中串口驱动和设备是挂在AMBA总线下的,其驱动程序文件为drivers/serial/amba-pl011.c,在linux内核配置中默认是使能该驱动的,如果没有则:make menuconfig -> Character devices ->Serial drives中使能,必须使能该驱动才能使用串口tty设备上面介绍串口
2016-05-06 09:15:25
1981
原创 ltib使用总结
ltib是飞思卡尔的编译安装包集合,是一个脚本集合,通过配置其可以编译不同目标平台的内核 uboot 根文件系统等,同时可以编译不同的rpm包。下面介绍一些使用总结:./ltib是执行默认的配置编译,一般在其官网上对应的芯片区下载的源码对应的就是其目标平台的配置。./ltib -m config 仅进行配置不编译./ltib --config 进行配置及编译./ltib --h
2016-03-01 10:52:11
714
转载 linux c函数获取系统IP地址
通过ioctl()函数下表列出了网络相关ioctl请求的request 参数以及arg 地址必须指向的数据类型: 类别Request说明数据类型套接口SIOCATMARK SIOCSPGRP SIOCGPGRP是否位于带外标记 设置套接口的进程ID 或进程组ID 获取套接口的进
2016-01-16 22:42:24
1297
转载 wed services SOAP调用实例
编写头文件:add.h 在这里我们不需要wsdl的文件,可以直接从.h文件来生成代码。我们定义一个函数声明文件,用来定义接口函数,名称为add.h#ifndef _ADDH_#define _ADDH_int ns2_add(int num1,int num2,int *sum);#endif3、产生代码框架我们执行一下命令,自动生成一些远程调用需要的文件。
2015-12-29 13:41:11
516
转载 堆栈、栈帧与函数调用过程分析
函数调用是程序设计中的重要环节,也是程序员应聘时常被问及的,本文就函数调用的过程进行分析。一、堆和栈首先要清楚的是程序对内存的使用分为以下几个区:l 栈区(stack):由编译器自动分配和释放,存放函数的参数值,局部变量的值等。操作方式类似于数据结构中的栈。l 堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由
2015-12-10 22:47:54
635
转载 exit2/ext3文件系统介绍
文件系统的构成引导块:存储引导代码 boot sector超级块:单块大小/总块数;每组块数;i节点数/每组i节点数;卷名;最后写入时间/挂载时间/挂载路径;空闲i节点/块信息(分配新i节点/块时使用)组描述符表:每个32字节,描述每组块位图/i节点位图/i节点表起始块号,块组中空闲块数和目录数;文件系统中所有块被等分为若干块组,最后一个可能略小;块位图:占有1个数据块I节点位
2015-12-09 17:11:08
682
转载 硬盘分区表知识——详解硬盘MBR
硬盘是现在计算机上最常用的存储器之一。我们都知道,计算机之所以神奇,是因为它具有高速分析处理数据的能力。而这些数据都以文件的形式存储在硬盘 里。不过,计算机可不像人那么聪明。在读取相应的文件时,你必须要给出相应的规则。这就是分区概念。 分区从实质上说就是对硬盘的一种格式化。当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即Master Boot Record,一
2015-12-05 21:10:29
682
转载 Shell编程之变量赋值和引用
Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量。有三种主要的变量类型:环境变量、内部变量/系统变量和用户变量。环境变量(environment variable)是系统环境的一部分,不必去定义它们。可以在shell程序中使用它们,某些变量(比如PATH)还能在shell中加以修改。内部变量(built-in variable)是由系统提供的。与环境变量不同,你不能
2015-12-04 17:02:41
4720
1
转载 Linux中fork函数详解
一、fork入门知识 创建一个进程并分配包括代码、数据等资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间,在内核创建进程的数据结构。然后把原来的进程的堆栈和内核数据结构
2015-12-04 10:25:40
467
转载 linux socket网络编程详解
什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程式员能够用他们来研发TCP/IP网络上的应用程式。要学Internet上的TCP/IP网络编程,必须理解Socket接口。Socket接口设计者最先是将接口放在Unix操作系统里面的。假如了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的 Socket数据传输是一种
2015-12-03 13:52:06
687
转载 Linux 虚拟内存和物理内存的理解
首先,让我们看下虚拟内存: 第一层理解1. 每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构 2. 一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间
2015-03-25 16:15:19
558
转载 Makefile选项CFLAGS,LDFLAGS,LIBS
CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项。这两个变量实际上涵盖了编译和汇编两个步骤。CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入
2015-01-23 14:00:37
645
转载 unzip和gunzip命令 .
Linux 常用的压缩命令有 gzip 和 zip,两种压缩包的结尾不同:zip 压缩的后文件是 *.zip ,而 gzip 压缩后的文件 *.gz 相应的解压缩命令则是 gunzip 和 unzip gzip 命令: # gzip test.txt 它会将文件压缩为文件 test.txt.gz,原来的文件则没有了,解压缩也一样 # gunzip test.txt.gz
2015-01-21 15:59:32
2454
转载 linux中memcpy和strcpy的区别
strcpy是拷贝字符串,以\0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止)strcpy的原型为:char *strcpy(char *dest, const char *src)其在内核源码中(lib/string.h)的实现如下:char *strcpy(char *dest, const char *src){ char *tmp = de
2015-01-21 10:11:24
701
转载 Linux进程间通信——使用信号量
这篇文章将讲述别一种进程间通信的机制——信号量。注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物。有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号。下面就进入信号量的讲解。一、什么是信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行
2015-01-20 15:03:48
525
转载 linux read/write和fread/fwrite有什么区别
1,fread是带缓冲的,read不带缓冲.2,fopen是标准c里定义的,open是POSIX中定义的.3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.4,fopen不能指定要创建文件的权限.open可以指定权限.5,fopen返回指针,open返回文件描述符(整数).6,linux/unix中任何设备都是文件,都
2015-01-20 11:20:50
596
转载 Linux进程间通信——使用共享内存
下面将讲解进程间通信的另一种方式,使用共享内存。一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc
2015-01-20 09:42:23
637
转载 Linux下 fseek() ftell() rewind() lseek() fstat() 的使用方法
fseek(移动文件流的读写位置)相关函数 rewind,ftell,fgetpos,fsetpos,lseek表头文件 #include定义函数 int fseek(FILE * stream,long offset,int whence);函数说明 fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的
2015-01-20 09:28:36
2901
转载 linux下C获取文件的大小 .
获取文件大小这里有两种方法:方法一、范例:[cpp] view plaincopyprint?unsigned long get_file_size(const char *path) { unsigned long filesize = -1; FILE *fp; fp = fopen(path, "r"); if
2015-01-20 09:09:54
654
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人