在编写C时,windows格式转为linux格式的命令
摘要:在做开发的时候,有时候开发的同事会在windows下的source insight 里面编程,那么在linux下面用vim打开,代码的每一行后面都会有一个“^M”这样会使整个代码很难受, 如何将其转为linux格式的呢?需要安装一个转换工具:sudo apt-get install dos2unixwin转为linux命令:dos2unix filelinux转为win命令:unix2dos file
阅读全文
如何更改ubuntu显示字体
摘要:此文章出于复制别人的sudo vim /etc/fonts/conf.d/49-sansserif.conf把 sans-serif改为 monospace如果修改后的字体 monospace 依然不能显示,则可以改为 宋体 来显示!另:不要安装 LiHei Pro 字体,在 ubuntu 上真的很难看!!!
阅读全文
关于电量计上报信息过程——底层驱动篇
摘要:我们都知道手机上显示电池的电量,温度,电压,当前健康状态都是通过底层的电量计具体实现的,但是他又是怎么上报给上层最终显示给用户的呢。1、了解struct power_supply结构体:153 struct power_supply {154 const char *name;//创建新接口的目录名字155 enum power_supply_type type;//这个type是显示当前是什么类型供电(USB\MAINS\BATTEY)156 enum power_supply_property *properties;//所要显示的电池属性(...
阅读全文
container_of
摘要:在linux内核驱动中,我们经常会用到container_of,实际上他是一个宏,其作用是我们可以根据该结构体变量中的某个成员首地址从而获得该结构体变量的首地址。其具体的定义如下:#define container_of(ptr, type, member) ({ \ 681 const typeof( ((type *)0)->member ) *__mptr = (ptr); \682 (type *)( (char *)__mptr - of...
阅读全文
strcpy和memcpy的区别
摘要:前一段时间,做了一段字节拷贝,结果发现用strcpy拷贝一直出错,结果用memcpy就没有出现问题。具体实例如下:1 memcpy(model_data, test_model_data, sizeof(test_model_data));其中model_data,sony_model_data 定义为u16数组; static const u16 model_data[] = {0}在linux内核中,关于这两个函数的声明和定义如下: 91 /** 92 * strcpy - Copy a %NUL terminated string 93 * @dest: ...
阅读全文
驱动中的id_table
摘要:或许在驱动中,你可以经常看到id_table这个变量,那么它是用来干什么的呢?首先,设备模型很清楚了吧,设备,驱动和总线之间的各种拉扯,我们都很清楚一个设备只能有一个驱动,但是驱动不会那么专一,他可以同时支持几个设备;这下知道了id_table的作用了吧。他就是用来让绑定设备和驱动的。如在include/linux/i2c.h中就有:74 const struct i2c_device_id *id_table;@id_table: List of I2C devices supported by this driver
阅读全文
linux内核中创建文件链接
摘要:之前做传感器之类,因为注册的是input设备,所以其文件接口都是以/sys/class/input/input1(2...n);这样就有一个问题,因为input生成的序列式随机的,所以如果一个设备注册不成功,那么input的序列号将会被打乱,如果上层读的input接口,这样子整个上下层就会出现问题。后来就想了一个解决办法,提供给上层的接口使用注册的i2c接口,这样对同一平台的是固定,但是当换了一个平台其注册的i2c线可能也不一样。所以很苦逼的,这两种方法都不是很好使,怎么办呢?通过链接的方法,把该设备路径链接到一个固定的路径,就OK了。这个实现的方法,强大的linux内核已经帮我们解决了。具体
阅读全文
linux内核中表示时间的结构体
摘要:上次讲了alarm后,大致看了一下内核的时间表示,所以就记录一下。一、时间的表示方法:Linux内核中表示时间的结构体和数据类型有5种:struct timeval; struct timespec; struct timezone; struct tm; time_t; struct rtc_time;具体其声明的头文件在:include/linux/time.h 12 #ifndef _STRUCT_TIMESPEC 13 #define _STRUCT_TIMESPEC 14 struct timespec { 15 __kernel_time_t tv_sec; ...
阅读全文
android alarm定时器
摘要:最近用了一下alarm定时器,之前有过接触,一直没有怎么整理,所以现在写写,方便以后回来看看。一、definition:接触过linux内核和android的应该都不会感到陌生,他是android基于内核rtc实现的一个定时器。一个硬件定时器,用于把设备从睡眠状态唤醒,定时时间到后可以唤醒系统,此时系统就可以做你想在特定时间要做的事情,基于该定时器还可以实现关机闹铃的功能。之前也有接触过高精度定时器hrtimer,但是它并不能唤醒系统,所以alarm更像一个外部中断,这是觉得这样理解他的作用就显而易见了。因为alarm是依赖于rtc实现的,所以很显然他还有一个功能就是掉电后还能正常工作的实时时
阅读全文
锂电池
摘要:锂电池battery,很简单的用途充电,可是他到底是怎么完成充电的,大电流是不是可以一直充电,他又是如何放电的,电池是如何保护的,电池,保护板,电芯又有什么样的联系呢?带着一些列的疑问,我们一起来学习电池吧!充电电池是由保护板和电芯组成的。电芯是电池中的蓄电部分,电芯的质量决定了电池的质量。电池保护板:对锂电池其保护作用的集成电路板。主要作用是过充保护,过放保护,过流、短路保护;1、正常工作时:当电芯电压在2.5V和4.35V之间时,电芯的负极与保护板的P-断相当于直接连通,保护板有电压输出。2、保护板过放时:当电池通过外接负载放电时,电芯的电压降慢慢降低,当电芯的电压下降到2.3V时,降认为
阅读全文
电平中断和脉冲中断
摘要:记得前面有篇文章介绍了终端的实现等,现在我们在了解一下,中断的种类:中断分为不同的种类:一、状态触发:在状态中断系统中,一个等待响应的中断会在中断请求路线上以特定的电平标识,如高电平(1)或低电平(0)。当一个设备希望发送中断请求信号时,他的驱动中断请求线路至响应的电平,并在CPU发出强制停止命令或处理所请求的中断时间之前始终保持。该中断模式在共享中断中存在一个严重的问题:只要还有任何设备的中断请求还未被处理,线路就会一直保持有效电平状态,而将导致CPU没有机会去探查其他设备所发生的状态变化。二、边沿触发:在边沿触发的中断系统中,中断设备通过向中端线路发送一个脉冲来表示其中断请求。脉冲可以为上
阅读全文
Linux内核锁机制——自旋锁
摘要:前面两篇文章,介绍的锁机制都是可用于可睡眠的线程中,但是自旋锁可以用于中断上下文中,因为他是不可睡眠的锁。自旋锁用于中断上下文,不能用于进程上下文,它是不可睡眠的锁,该进程若有睡眠,就不能使用该锁,因为会发生死锁。在内核中,自旋锁机制是如果当前可获得自旋锁则代码进入临界区,如果当前锁不可获得,则代码进入忙循环中并时刻检查该锁,知道锁可用。所以这个忙循环就是自旋锁的“自旋”部分。1、头文件:include/linux/spinlock.h结构体:spinlock_t lock;2、定义及其初始化自旋锁:277 #define spin_lock_init(_lock) ...
阅读全文
Linux内核锁机制——互斥锁
摘要:前一篇文章讲的是completion信号量,该机制不能用于中断上下文中,因为该锁可睡眠。接下来,介绍的锁机制也是一个可以睡眠的锁——互斥锁,所以该锁也不能用于中断上下文中;1、头文件:include/linux/mutex.h结构体: 48 struct mutex { 49 /* 1: unlocked, 0: locked, negative: locked, possible waiters */ 50 atomic_t count; 51 spinlock_t wait_lock; ...
阅读全文
Linux内核锁机制——completion信号量
摘要:在linux内核中,引入锁机制主要是解决资源并发与竞争问题;主要常用锁机制:信号量,自旋锁,互斥锁;该篇文章主要讲解的是completion信号量。(1)completion信号量:completion信号量是一个轻量级的机制,它允许一个线程告诉另一个线程某个工作已经做完了;1、头文件:include/linux/completion.h结构体:1 25 struct completion {2 26 unsigned int done;3 27 wait_queue_head_t wait;4 28 };5 29 2、定义及其初始化一个信号量:静态定...
阅读全文