摘要: ### ChunkChunk是一系列语句。交互模式下的每一行都是一个Chunk。一个lua文件也可以是一个Chunk,文件可用dofile导入。### 变量全局变量不需要初始化,未初始化变量的值是nil。删除一个变量只需将其赋值为nil。局部变量用 local 修饰### 注释单行注释: --多行注... 阅读全文
posted @ 2014-09-04 16:13 sammei 阅读(324) 评论(0) 推荐(0) 编辑
摘要: ### getifaddrs获取本地网络接口的信息。在路由器上可以用这个接口来获取wan/lan等接口当前的ip地址,广播地址等信息。``` #include #include int getifaddrs(struct ifaddrs **ifap); ... 阅读全文
posted @ 2014-09-04 11:24 sammei 阅读(7885) 评论(0) 推荐(1) 编辑
摘要: 在分析luci时,看到 usr/lib/luci/sys.lua 里调用 nixio.sysinfo()。这是一个c调用lua的用例。在nixio的代码process.c里导出了给lua调用的接口。在其中看到nixio.sysinfo()的实现是调用linux的sysinfo()系统调用。``` ... 阅读全文
posted @ 2014-09-04 10:14 sammei 阅读(1915) 评论(0) 推荐(0) 编辑
摘要: ## 套接字地址结构### ipv4套接字地址结构在头文件 中定义```struct in_addr { in_addr_t s_addr; //32位ipv4地址};struct sockaddr_in { uint8_t sin_len; sa_family_t ... 阅读全文
posted @ 2014-09-02 23:58 sammei 阅读(699) 评论(0) 推荐(0) 编辑
摘要: 最近越來越感覺到熟練運用office軟件是一門很深的學問,以前一直忽視了這個技能,因爲從來都不覺得這個有什麼技術難度。正是因爲這樣想,所以才一直沒能去好好研究使用這套工具。現在卻覺得有必要學習,在於:1. 工具可以幫我們提高效率。更何況office是電腦上最基礎最常用的工具。可能因爲這套軟件太常見了... 阅读全文
posted @ 2014-08-31 03:42 sammei 阅读(312) 评论(0) 推荐(0) 编辑
摘要: 我本机装的是64位Ubuntu, SDK 里提供的 buildroot-gcc342 是32位的,无法直接运行,需要先安装 gcc-multilib.sudo apt-get install gcc-multilib之前一直做 ARM 开发, 对这里 MIPS 首先要了解一点它的 MMU 内存映射关... 阅读全文
posted @ 2014-08-25 16:30 sammei 阅读(6917) 评论(0) 推荐(1) 编辑
摘要: PHY模块简介物理层位于OSI最底层,物理层协议定义电气信号、线的状态、时钟要求、数据编码和数据传输用的连接器。 物理层的器件称为PHY。上图里的灰色方框图里的就是PHY芯片内部模块图。 MAC器件通过MII接口来与PHY进行数据交换。 从图中可以看到向外发送数据和从外部接收数据时PHY所要做的一些... 阅读全文
posted @ 2014-08-25 00:50 sammei 阅读(15207) 评论(0) 推荐(2) 编辑
摘要: drivers/staging/android/lowmemorykiller.clowmemorykiller 在系统空闲内存不足时, 根据一定机制选择某个进程, 然后杀死它.1. register_shrinker(&lowmem_shrinker); 向 shrinker 注册一个回调. 当内核线程尝试回收系统内存页时, 会逐个回调已注册的 shrinker. 调用时机涉及到内存管理一块, 暂不关心.2. 有两个数组: int lowmem_adj[6] 和 int lowmem_minfree[6] .lowmem_adj[6] 存储 oom_score_adj阀值.lowme 阅读全文
posted @ 2014-03-25 17:51 sammei 阅读(1404) 评论(0) 推荐(0) 编辑
摘要: 写 driver 时, probe 中常常要为设备分配一些资源, 如 内存 / irq / gpio / iomap 等. 而在 probe 中失败时又要小心的释放掉这些资源. 底层驱动开发人员可能会把大部分精力放在 probe 成功的处理流程上, 而失败的情况可能出现的较少以致于忘记测试. 这导致的一个问题是当设备加载失败时, 系统中会遗留许多与之相关的资源.为了干净优雅的处理这种问题, 驱动模型中引入了 devres 机制. 在为 device 分配资源的时候记录下它们, 等到 device detach 的时候, 就可以统一释放.devres 是一种资源管理机制, 类似于一种垃圾收集处理 阅读全文
posted @ 2013-12-30 16:42 sammei 阅读(2697) 评论(0) 推荐(0) 编辑
摘要: spinlock in linux kernel作为一种锁机制, spinlock可以制造一段临界区, 同一时刻只有一个线程能进入这个临界区, 从而达到保护数据的目的. semaphore, mutext也有同样的作用.spinlock采用busy waiting的实现方式, 无法获取锁时线程一直处于忙等待状态(而不是进入休眠,放弃处理器).使用spinlock的注意事项1. 持有spinlock的上下文不能主动放弃处理器. 包括禁止抢占, 不能休眠. 如果中断中也要获取spinlock, 需要禁止中断.2. 持有spinlock的时间越短越好.3. 锁被持有时, 持有者不允许再次尝试获取该锁 阅读全文
posted @ 2013-08-13 15:14 sammei 阅读(1080) 评论(0) 推荐(0) 编辑
摘要: pwm模块可以设置的参数有prescaler, period, duty.period参数的大小决定了这个pwm的分辨率。比如period有12位,即它的一个周期最多可以分为4096个等级。cpu提供clk给pwm模块, pwm需要对这个clk做分频动作,分频系数由prescaler决定。linux 中pwm接口位于,其中有int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);其参数定义, period_ns为pwm最终输出脉冲的周期,duty_ns为pwm最终输出脉冲周期中占空比时间(高电平时间)。在这个函数中要 阅读全文
posted @ 2013-04-25 19:22 sammei 阅读(7692) 评论(0) 推荐(1) 编辑
摘要: 在arm板上安装Debian. 这里实际上安装的是一个文件系统,u-boot和内核都是用原来的。主要目的是在目标板上建立Debian的桌面环境,包括图形界面。主机环境 Debian squeeze 6.07目标板 arm contex-A8大概的流程如下:1. 在PC端构建好一个Debian的最小系统,里面有我们基本需要的各种包。apt-get install debootstrapcd gripdebootstrap --arch=armel --foreign --include=vim,openssh-server squeeze rootfs/ http://www.emdebian. 阅读全文
posted @ 2013-03-29 21:17 sammei 阅读(3152) 评论(0) 推荐(0) 编辑
摘要: 做Android camera时遇到这些知识,记个笔记。参考:http://zh.wikipedia.org/zh-cn/YUVhttp://www.fourcc.org/yuv.phphttp://ticktick.blog.51cto.com/823160/555791YUV用于表示一种颜色空间,Y表示明亮度,U表示色度,V表示浓度。根据数据的存储不同,YUV分为两类: 1. 紧凑格式 (packed formats): 将Y、U、V值混合在一起存储,与RGB存放方式类似。 2. 平面格式 (planar formats): 将Y、U、V三个分量分别存放在不同矩阵中。RGB格式里分为RGB 阅读全文
posted @ 2013-03-27 00:46 sammei 阅读(938) 评论(0) 推荐(0) 编辑
摘要: 手上的USB无线网卡是tenda 832u,插入后 lsusb 显示Bus 001 Device 002: ID 148f:5372 Ralink Technology, Corp. 芯片是ralink的5372。附带光盘上有驱动2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2解压后进去编译。我采用Network-Manager来管理网络,且无线网络是WPA类型认证的,所以在编译前要打开相关的宏。位于os/linux/config.mk# Support Wpa_Supplicant HAS_WPA_SUPPLI. 阅读全文
posted @ 2013-03-17 15:14 sammei 阅读(1867) 评论(0) 推荐(0) 编辑
摘要: asm的路径是 arch/xxx/include/asm/asm-generic 的路径是 include/asm-generic/代码中包含asm/中的头文件,如果某一个架构没有自己特殊代码的话,其中会使用通用版本的头文件,即包含 asm-generic/里的对应.h文件。代码中不会直接包含 asm-generic/ 里的.h文件拿arm来举例#include 引用的头文件是 arch/arm/include/asm/gpio.h#include 引用的是头文件是 include/asm-generic/gpio.h 阅读全文
posted @ 2013-03-14 13:43 sammei 阅读(3585) 评论(0) 推荐(0) 编辑
摘要: 想用busybox制作一个干净的rootfs来测试内核。之前也从前做过rootfs,这次不同的是想用ramdisk的方式来挂载这个rootfs。没想到遇到一点问题搞了一下午。通常引导内核时向command line传递的参数都是 init=xxx ,而对于initrd 则是传递 rdinit=xxx 。处理代码位于 init/main.crdinit=xxx 在内核中被 ramdisk_execute_command 变量接收,如果没有rdinit参数,ramdisk_execute_command默认为"/init"。sys_access()检查ramdisk_execu 阅读全文
posted @ 2013-03-06 20:06 sammei 阅读(1911) 评论(0) 推荐(0) 编辑
摘要: 1. module_init() / module_exit()include/linux/init.hmodule_init()函数修饰模块的入口函数。根据是否定义MODULE,module_init()这个宏有不同的展开。没有定义MODULE时,模块与内核链接成一个文件,module_init()修饰的函数被内核177 #define __define_initcall(level,fn,id) \ 178 static initcall_t __initcall_##fn##id __used \ 179 __attribute__((__section_... 阅读全文
posted @ 2013-03-04 11:15 sammei 阅读(856) 评论(0) 推荐(0) 编辑
摘要: SPI传输协议笔记SPI: Serial Peripheral Interface由Motorola发起的一个同步串行数据传输标准,全双工,以主从(Master/Slave)模式通信。多片从设备使用片选信号(chip select)。SPI又称为4线串行总线(four-wire serial bus)。MISO: Master input Slave output, output from slave.MOSI: Master output Slave Input, output from master.SS : Slave select, active low, output from ma 阅读全文
posted @ 2013-03-04 11:09 sammei 阅读(1306) 评论(0) 推荐(0) 编辑
摘要: include/linux/semaphore.hkernel/semaphore.cstruct semaphore { spinlock_t lock; unsigned int count; struct list_head wait_list;};信号量本质上是一个计数器。count不为0时进程可以获得信号量,count为0时进程无法获得信号量,因而可能进入休眠。当count初始为1时,其作用类似于互斥量mutex。但linux中的mutex实现机制已经不再使用semaphore,而使用另一套更简单有效的方法。信号量用于资源可以同时被多个进程使用时的场景。void sema_in... 阅读全文
posted @ 2013-02-25 16:36 sammei 阅读(1755) 评论(0) 推荐(1) 编辑
摘要: 专业术语:MIPI - Mobile Industry Processor Interface.DCS - Display Command Set.DBI/DPI - Display Bus Interface / Display Pixel Interface. DBI : Parallel interface to display modules having display controllers and frame buffers. DPI : Parallel interface to display modules without on-pannel display contr.. 阅读全文
posted @ 2013-02-04 16:28 sammei 阅读(2318) 评论(0) 推荐(0) 编辑
摘要: 阅读android的init代码中uevent部分时,发现openat系统调用。小记一下: #include int openat(int dirfd, const char *pathname, int flags); int openat(int dirfd, const char *pathname, int flags, mode_t mode);openat系统调用与open功能类似,但用法上有以下不同:1. 如果pathname是相对地址,以dirfd作为相对地址寻址目录。而open是从当前目录开始寻址的。2. 如果pathname是相对地址,且dirfd的值是AT_... 阅读全文
posted @ 2013-01-28 20:49 sammei 阅读(680) 评论(0) 推荐(0) 编辑
摘要: MDDI (Mobile Display Digital Interface)http://www.amobbs.com/thread-5512431-1-1.htmlMIPI (Mobile Industry Processor Interface)http://www.amobbs.com/thread-5512615-1-1.htmlMIPI联盟旨在推荐手机应用处理器接口标准化。其中有Display工作组制定显示相关规范,包括:1. DCS (Display Command Set) 规定显示命令设置相关规范。2. DBI (Display Bus Interface) 2.1 MI.. 阅读全文
posted @ 2013-01-07 22:50 sammei 阅读(1721) 评论(0) 推荐(0) 编辑
摘要: copy-on-write进程创建后,子进程复制父进程的页表映射,而不是具体的物理页。那么子进程和父进程就共享了物理页中的数据。如果此时其中一个进程要做数据修改操作,则必定会影响到另一个进程。为解决这个问题,在复制页表时,将页表中可写的页表项(有PTE_W标志)设置成只读的,并置上PTE_COW标志,表示这个页表项指定的页是copy-on-write的页。如果其中一个进程向cow页写入数据,此时肯定会发生pagefault异常。在pagefault handler里检查这个页面是进程共享的COW页,则分配一个新的页面给该进程,并修改页表项的标志位。内核栈注意一个细节. 这其实是LAB3里的内容 阅读全文
posted @ 2012-12-06 15:11 sammei 阅读(813) 评论(0) 推荐(0) 编辑
摘要: 先看看xv6的进程创建和切换机制,再做jos实验lab3xv61. 创建第一个进程userinit()1. 从进程结构数组找到一个空闲的进程结构 struct proc2. 为进程创建页目录pgdir,并在其中对内核区域进行映射(setupkvm, kmap)3. 申请一个物理页,复制initcode,并将其映射到0地址开始。4. 设置进程的trapframe数据,进程的栈如下图。5. 将进程状态设置为RUNNABLE2. 进程切换刚刚创建好第一个进程init,那么如何切换到该进程环境中去执行?scheduler()1. 到进程数组中找到状态为RUNNABLE的进程。当前系统只有init这个进 阅读全文
posted @ 2012-11-26 16:22 sammei 阅读(982) 评论(0) 推荐(0) 编辑
摘要: 进程为程序提供了私有的环境,或者说是地址空间,保证这个地址空间不会被其他程序读写。操作系统要结合硬件的内存管理单元来实现这个功能。先来看看xv6* 分页x86的分页机制使用页表(page table)来将虚拟地址转换(或者称为映射)成物理地址。虚拟地址是程序指令看到的地址,物理地址是处理器硬件看到的地址。一个页表有2^20个入口项PTE(page table entry)。每个PTE有20-bit的物理页号(physical page number PPN)和一些标志。如下图,实际的转换过程分为两级,映射过程:1. 用虚拟地址的最高10位(Dir)到页目录中找到相应页目录项(CR3寄存器中保存 阅读全文
posted @ 2012-11-23 23:54 sammei 阅读(1176) 评论(0) 推荐(0) 编辑
摘要: 这个实验分为三个部分:1. 熟悉x86汇编语言,QEMU x86模拟器,和PC上电启动过程。2. 介绍6.828内核的引导加载程序(boot loader),位于boot目录。3. 介绍6.828内核的原型JOS,位于kernel目录软件设置:下载jos源代码,搭建环境第一部分:PC引导* 熟悉x86汇编x86的汇编语法有NASM汇编和GNU汇编两种,NASM是所谓的Intel语法,GNU使用AT&T语法。两者语义相同表达方式不同,区别可见http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html其中关于 阅读全文
posted @ 2012-11-21 11:49 sammei 阅读(1093) 评论(0) 推荐(0) 编辑
摘要: Linux power supply class========================UPS:不间断电源, uninterrupted power supply,当正常交流供电中断时,将蓄电池输出的直流变换成交流持续供电的电源设备。AC:交流电(alternating current)DC:直流电(Direct Current,简称DC),是指方向和时间不作周期性变化的电流,但电流大小可能不固定,而产生波形。摘要~~~~Power supply class用于向用户层提供电池、UPS、AC、DC等电源的属性。其中定义了一系列核心属性,几乎囊括所有电源设备。这些属性通过sysfs和ue 阅读全文
posted @ 2012-11-12 11:38 sammei 阅读(1505) 评论(0) 推荐(0) 编辑
摘要: jiffies的定义:// include/linux/jiffies.h extern u64 __jiffy_data jiffies_64; extern unsigned long volatile __jiffy_data jiffies;Gcc defines __ARMEB__ for big-endian ARM and __ARMEL__ forlittle-endian ARM.以小端为例,arch/arm/kernel/vmlinux.lds 中将jiffies定义为jiffies_64的低4位。以arm平台为例,jiffies变量是unsigned long类型的,那么 阅读全文
posted @ 2012-11-05 18:13 sammei 阅读(787) 评论(0) 推荐(0) 编辑
摘要: 硬件资源越来越庞大和复杂,内核的另一个挑战就是要便捷的管理这些资源。同时,面对如此之多的平台不同的CPU,管理机制需要统一适用,这就需要对资源的管理抽象到更加通用的层次。CPU中各个模块都需要时钟驱动,内核需要一种机制能通用所有的平台,方便的管理CPU上所有的clk资源。这里分析Linux对clk的管理。Linux version: 2.6.38平台: i.mx53 (mxc),以下所有平台相关部分都特指i.mx53涉及的源文件有:include/linux/clk.hdrivers/clk/clkdev.carch/arm/plat-mxc/clock.carch/arm/mach-mx5/ 阅读全文
posted @ 2012-10-15 15:58 sammei 阅读(8472) 评论(1) 推荐(0) 编辑
摘要: 1. 对象的创建2. 事件的传递上图中有标示出来,RawEvent是待发出去的事件,InputReader经由QueueInputListener就可以关联到InputDispatch,最后由InputDispatch将事件处理或分发出去。InputManager::InputManager( const sp& eventHub, const sp& readerPolicy, const sp& dispatcherPolicy) { mDispatcher = new InputDispatcher(dispatcherPolicy... 阅读全文
posted @ 2012-10-10 17:55 sammei 阅读(1595) 评论(0) 推荐(0) 编辑
摘要: frameworks/base/services/java/com/android/server/PowerManagerService.java0. 当没有外部事件时,过了一段时间小机会自动进入熄屏或休眠。所以只要有用户操作屏幕和键盘等事件,就要重新设定自动休眠的定时器。frameworks\base \services\java\com\android\server\WindowManagerService.javaWindowManagerService会把用户的点击屏幕,按键等作为user activity事件来调用userActivity函数.1. userActivity()use 阅读全文
posted @ 2012-10-09 15:03 sammei 阅读(1319) 评论(0) 推荐(0) 编辑
摘要: Android手机可以通过局域网共享来访问PC上的数据,Android连接到路由器的无线网络就可以与PC复制相片音乐等,相比于再连接一根USB,无线网络方便多了。在winxp下共享设置很方便,Linux下需要使用samba。1. 安装软件包sudo apt-get install samba samba-commonsudo apt-get install smbclient smbfs2. 配置/etc/samba/smb.conf[share]comment = Shared Folder with username and passwordbrowseable = yeswritable 阅读全文
posted @ 2012-10-08 15:44 sammei 阅读(743) 评论(0) 推荐(0) 编辑
摘要: PWM信号可通过调整占空比来调节输出电压,可以使用PWM来控制LCD的背光。但CPU的pwm引脚驱动能力太弱,常外接一个背光芯片。rt9293就是这样的一个恒流升压转换器。Iled=Vref/RsetVfb=Duty * 300mV (Duty是EN输入信号的占空比,300mV是内部参考电压)PWM占空比就是用来对内部300mV进行分压的。经过低通滤波器来过滤脉冲信号,最后输出连接到误差放大器(EA),回送FB信号。输入PWM信号频率小于500Hz时,VA也是一个PWM信号,控制输出电压。输入PWM信号频率大于500Hz时,VA相当于一个直流信号。两个频率的典型值是200Hz和20kHz. 误 阅读全文
posted @ 2012-09-29 15:30 sammei 阅读(1064) 评论(0) 推荐(0) 编辑
摘要: mx53的几个模式:1. RUN - core+时钟+外设都工作,由软件控制哪些模块的时钟可被停止。2. WAIT - core停止,clock停止,总线时钟和外设按需打开。3. STOP - core停止,外设停止,总线时钟停止,DPLLs关闭。其中2/3都属于WFI(Wait For Interrupt)模式,cpu停止直到唤醒源到来。mx53执行WFI指令的过程:1. 允许CPU进入Deep Sleep(ARM_LPC, Low Power Control 11.3.3)ARM_LPC.DBGDSM = 1 ,在DEBUG模式时允许CPU进入Deep Sleep ModeARM_LPC. 阅读全文
posted @ 2012-09-21 17:12 sammei 阅读(744) 评论(0) 推荐(0) 编辑
摘要: 1. BOOT_MODE[1:0] 内部寄存器RESET_B上升沿时,BOOT_MODE[1:0]从BOOT_MODE0和BOOT_MODE1两个引脚获取初始值。(BOOT_MODE[1:0]的值可以从SRC_SBMR寄存器的BMOD[1:0]域读到)2. Boot eFUSE(1) BT_FUSE_SEL* BOOT_MODE[1:0]=0b00 BT_FUSE_SEL=0, SBMR的值由GPIO决定。 BT_FUSE_SEL=1, SBMR的值由eFUSE设置(BOOT_CFG1/2/3)。* BOOT_MODE[1:0]=0b10 BT_FUSE_SEL=0, 启动设备(如Flash, 阅读全文
posted @ 2012-09-18 12:26 sammei 阅读(710) 评论(0) 推荐(0) 编辑
摘要: 同事在调试一个外设时发现:a. 系统正常运行的情况下,使用这个设备会触发中断并调用它的中断处理函数。b. 系统休眠之后,使用这个设备可以唤醒系统,但中断处理函数却没有被调用。能够唤醒系统,说明中断一定是触发了。另发现小板上的键盘是可以的,休眠后按键可以调到keyboard的中断处理函数。跟踪这个问题,发现以下几点:1. Linux在系统休眠时会调用dpm_suspend_noirq()-> suspend_device_irqs()。 当系统休眠时,设备驱动需要禁止接收中断,suspend_device_irqs()屏蔽所有正在 使用的中断(置IRQ_DISABLED标志),timer中 阅读全文
posted @ 2012-09-17 18:32 sammei 阅读(1243) 评论(2) 推荐(0) 编辑