<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[xiaoaide01的专栏]]></title><description><![CDATA[本人从事电子软硬件研发]]></description><link>https://blog.youkuaiyun.com/xiaoaide01</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; xiaoaide01]]></copyright><item><title><![CDATA[pl330 dmac驱动分析2----关键函数]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/54864134</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/54864134</guid><author>xiaoaide01</author><pubDate>Tue, 07 Feb 2017 18:06:46 +0800</pubDate><description><![CDATA[饿哦]]></description><category></category></item><item><title><![CDATA[pl330 dmac驱动分析1--数据结构]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/54861385</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/54861385</guid><author>xiaoaide01</author><pubDate>Sat, 04 Feb 2017 16:32:41 +0800</pubDate><description><![CDATA[pl330 dmac是基于arm amba的dma控制器，最多有8个操作通道，32个事件处理，并且有多个外设接口，有自己的命令集，详细信息看pl330 datesheet。


pl330驱动程序：
      pl330驱动程序位于看kernel/driver/dma/pl330.c文件，该驱动程序由三星coder写的。

      驱动的关键数据结构：






]]></description><category></category></item><item><title><![CDATA[linux rculist代码分析]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52710742</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52710742</guid><author>xiaoaide01</author><pubDate>Fri, 30 Sep 2016 17:13:48 +0800</pubDate><description><![CDATA[linux内核rcu机制，是在多读线程和一个写线程并发情况下对指针的保户机制，多写并发需要加锁。
常应用于链表的数据操作中。
linux内核rculist.h是对链表带rcu保护机制操作函数的实现和封装，位于kernel/include/linux/ruclist.h
下面介绍rculist中的函数或宏
1、list_next
/*
 * return the ->next point]]></description><category></category></item><item><title><![CDATA[linux i2c子系统代码分析9---i2c设备的注册方法]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52524947</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52524947</guid><author>xiaoaide01</author><pubDate>Tue, 13 Sep 2016 14:56:23 +0800</pubDate><description><![CDATA[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]]></description><category></category></item><item><title><![CDATA[linux内核编译Kconfig总结]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52518047</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52518047</guid><author>xiaoaide01</author><pubDate>Tue, 13 Sep 2016 10:34:05 +0800</pubDate><description><![CDATA[linux内核make menuconfig生成.config时，会调用GUI配置工具，这个GUI配置工具具体调用的就是内核各目录下的Kconfig文件，Kconfig文件层次结构和各内核目录中层次相似，最终形成GUI的各级配置菜单。
下面首先介绍Kconfig文件规则：

Kconfig文件的基本要素：
1.config条目(entry)
  config TMPFS_POSIX_AC]]></description><category></category></item><item><title><![CDATA[linux i2c子系统代码分析7 ---i2c适配器注册时机、方法以及例程]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52441464</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52441464</guid><author>xiaoaide01</author><pubDate>Tue, 06 Sep 2016 11:08:48 +0800</pubDate><description><![CDATA[i2c适配器注册时机：
1、在paltform驱动中注册，在板级初始化时注册一个platform设备，然后在注册platform驱动时将i2c适配器注册。
这种方法属于适配器静态注册，是soc中i2c适配器通用注册方法，因为这样保证后续的i2c驱动注册以及i2c设备注册能找到匹配的适配器，i2c驱动和i2c设备注册在i2c适配器注册之后。
2、加载一个内核模块，在模块中完成i2c适配器注册，]]></description><category></category></item><item><title><![CDATA[linux i2c子系统代码分析8 ---i2c子系统内核目录介绍]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52441600</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52441600</guid><author>xiaoaide01</author><pubDate>Mon, 05 Sep 2016 17:05:10 +0800</pubDate><description><![CDATA[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]]></description><category></category></item><item><title><![CDATA[linux i2c子系统代码分析6 ---操作函数i2c数据处理函数]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52439393</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52439393</guid><author>xiaoaide01</author><pubDate>Mon, 05 Sep 2016 14:27:23 +0800</pubDate><description><![CDATA[下面介绍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]]></description><category></category></item><item><title><![CDATA[linux i2c子系统代码分析5 ---操作函数i2c_new_device  i2c_new_probed_device   i2c_register_board_info介绍]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52438714</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52438714</guid><author>xiaoaide01</author><pubDate>Mon, 05 Sep 2016 13:08:20 +0800</pubDate><description><![CDATA[下面介绍i2c设备操作相关函数
1、
kernel/driver/linux/i2c/i2c-core.c
struct i2c_client *
i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)      i2c适配器静态增加新i2c设备，根据 i2c_board_info 静态设备声明]]></description><category></category></item><item><title><![CDATA[linux i2c子系统代码分析4 ---操作函数i2c_add_driver    i2c_register_driver介绍]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52437697</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52437697</guid><author>xiaoaide01</author><pubDate>Mon, 05 Sep 2016 10:32:10 +0800</pubDate><description><![CDATA[下面介绍 i2c 驱动相关操作函数
i2c_add_driver

kernel/include/linux/i2c.h
static inline int i2c_add_driver(struct i2c_driver *driver)
{
return i2c_register_driver(THIS_MODULE, driver);

}
 i2c_add_driver]]></description><category></category></item><item><title><![CDATA[linux i2c子系统代码分析3 ---操作函数i2c_add_adapter   i2c_add_numbered_adapter介绍]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52422920</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52422920</guid><author>xiaoaide01</author><pubDate>Sat, 03 Sep 2016 17:56:28 +0800</pubDate><description><![CDATA[二.i2c子系统操作函数，i2c-core.c


kernel/driver/linux/i2c/i2c-core.c

/**
 * i2c_add_adapter - declare i2c adapter, use dynamic bus number
 * @adapter: the adapter to add
 * Context: can sleep
 *
 *]]></description><category></category></item><item><title><![CDATA[linux i2c子系统代码分析2 ---操作函数i2c_init介绍]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52422829</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52422829</guid><author>xiaoaide01</author><pubDate>Sat, 03 Sep 2016 13:56:14 +0800</pubDate><description><![CDATA[2.i2c子系统操作函数，i2c-core.c
上面介绍了i2c子系统重要的数据结构，下面介绍i2c子系统的适配器、算法、设备、设备驱动注册、注销以及重要的数据处理函数


在kernel/driver/linux/i2c/i2c-core.c文件中




static int __init i2c_init(void)
{
int retval;


retval]]></description><category></category></item><item><title><![CDATA[linux i2c子系统代码分析1 ---概述以及主要数据结构]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52410851</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52410851</guid><author>xiaoaide01</author><pubDate>Sat, 03 Sep 2016 13:46:10 +0800</pubDate><description><![CDATA[概述：
i2c是很流行的串行半双工通信协议，主从架构。
linux 中有关于i2c子系统的实现支持，其和平台无关的，具体实现需要驱动工程师自己实现。
linux i2c中核心代码是i2c-core.c 其有i2c适配器、i2c算法、i2c驱动以及i2c设备注册、注销以及数据处理的实现。
再介绍下i2c子系统各部分的关系：i2c适配器是设备，是i2c具体外设（外部或芯片内部）的抽象，i2c算]]></description><category></category></item><item><title><![CDATA[linux中关于原子操作]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52092590</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52092590</guid><author>xiaoaide01</author><pubDate>Tue, 02 Aug 2016 15:32:55 +0800</pubDate><description><![CDATA[原子操作:就是在执行某一操作时不被打断。
linux原子操作问题来源于进程的抢占以及多核smp系统中程序的并发执行。
对于临界区的操作可以加锁来保证原子性，对于全局变量或静态变量操作则需要依赖于硬件平台的原子变量操作。
因此原子操作有两类：一类是各种临界区的锁，一类是操作原子变量的函数。
对于arm来说，单核每条汇编指令都是原子的，多核smp也是，因为有总线仲裁所以cpu可以单独占用总线直]]></description><category></category></item><item><title><![CDATA[linux kernel的中断子系统：GIC代码分析]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/52040579</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/52040579</guid><author>xiaoaide01</author><pubDate>Tue, 26 Jul 2016 23:12:10 +0800</pubDate><description><![CDATA[一、前言

GIC（Generic Interrupt Controller）是ARM公司提供的一个通用的中断控制器，其architecture specification目前有四个版本，V1～V4(V2最多支持8个ARM core，V3/V4支持更多的ARM core，主要用于ARM64服务器系统结构）。目前在ARM官方网站只能下载到Version 2的GIC architecture sp]]></description><category></category></item><item><title><![CDATA[linux内核自旋锁总结]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/51839514</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/51839514</guid><author>xiaoaide01</author><pubDate>Wed, 06 Jul 2016 16:29:52 +0800</pubDate><description><![CDATA[1、自旋锁实现：
自旋锁是一个互斥设备，它只有两个值：“锁定”和“解锁”。它通常实现为某个整数值中的某个位。希望获得某个特定锁得代码测试相关的位。如果锁可用，则“锁定”被设置，而代码继续进入临界区；相反，如果锁被其他人获得，则代码进入忙循环（而不是休眠，这也是自旋锁和一般锁的区别）并重复检查这个锁，直到该锁可用为止，这就是自旋的过程。
“测试并设置位”的操作必须是原子的，多线程并发获取锁时所做]]></description><category></category></item><item><title><![CDATA[linux 时间函数总结]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/50978203</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/50978203</guid><author>xiaoaide01</author><pubDate>Thu, 16 Jun 2016 09:49:13 +0800</pubDate><description><![CDATA[首先了解关于时间的一些概念：
UTC：协调世界时，又称为世界标准时间，也就是大家所熟知的格林威治标准时间（Greenwich Mean Time，GMT，本地时间是基于其的差值
本地时间：本地时间是utc时间和本地时区的差值
日历时间，是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同，但对一个编译系统来 说，这个标准时间点是不变的，该编译]]></description><category></category></item><item><title><![CDATA[hi3531 uboot phy调试总结]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/51104837</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/51104837</guid><author>xiaoaide01</author><pubDate>Thu, 16 Jun 2016 09:46:09 +0800</pubDate><description><![CDATA[首先调试检查硬件，再调试软件
首先仔细阅读phy和主芯片datesheet 

硬件注意：关于phy的芯片需要注意的有几点：1、mdio接口和rgmii或者mii接口是否正确。2、电源是否稳定，晶振是否起振并且频率匹配。3、phy地址的配置是否正确，不能是0地址，因为0地址默认是所以芯片的地址。4、phy芯片输出时钟是否正确。4、phy和主芯片rgmii接口电平是否匹配。
关于主芯片mac]]></description><category></category></item><item><title><![CDATA[linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/51659037</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/51659037</guid><author>xiaoaide01</author><pubDate>Mon, 13 Jun 2016 17:45:29 +0800</pubDate><description><![CDATA[1、特权级      




Intel x86架构的cpu一共有0～4四个特权级，0级最高，3级最低，ARM架构也有不同的特权级，硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查。硬件已经提供了一套特权级使用的相关机制，软件自然要好好利用，这属于操作系统要做的事情，对于UNIX/LINUX来说，只使用了0级特权级别和3级特权级。也就是说在UNIX/LINUX系统中，一条工作]]></description><category></category></item><item><title><![CDATA[linux shell环境变量总结]]></title><link>https://blog.youkuaiyun.com/xiaoaide01/article/details/51524520</link><guid>https://blog.youkuaiyun.com/xiaoaide01/article/details/51524520</guid><author>xiaoaide01</author><pubDate>Sat, 28 May 2016 13:52:51 +0800</pubDate><description><![CDATA[用户登录时就是打开一个shell进程，其会加载profile和bashrc文件中的变量，其变量就是环境变量，是所有其子进程全局变量。
所以每次登陆一个终端都是重新打开一个shell进程，会重新加载环境变量，因此之前设置的环境变量都会失效。


当在此shell下打开一个shell脚本时就是重新打开一个shell进程，其可以继承父进程的全局变量，也可以修改一个全局变量，但是只有其子shell]]></description><category></category></item></channel></rss>