Chinaunix首页 | 论坛 | 博客
  • 博客访问: 422870
  • 博文数量: 60
  • 博客积分: 442
  • 博客等级: 下士
  • 技术积分: 910
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-27 14:53
文章分类

全部博文(60)

文章存档

2021年(1)

2018年(1)

2017年(14)

2016年(31)

2015年(1)

2013年(3)

2012年(9)

我的朋友

分类: LINUX

2012-08-29 15:50:07

----------------------------------------------------------------------------
bmp图像大小:
size = 54Byte header + width * height * bit/像素 + (PER_SECTOR_SIZE - 1)
图片所用扇区数 = size / PER_SECTOR_SIZE
总大小 = 图片所用扇区数 * PER_SECTOR_SIZE
 
etc:
求某些数据(n)占多少扇区(k)时可以这么写:
k = n + (PER_SECTOR_SIZE - 1) / PER_SECTOR_SIZE;
----------------------------------------------------------------------------
设置寄存器的某一位:
int rc;
unsigned char data;
XXX_I2C_SET_IBAT_REG(&data, XXX_RESET, 1, rc);
 
展开后:
#define XXX_I2C_SET_IBAT_REG(p_data, bitname, val, ret)            
        do {                                                           
                ret = XXX_i2c_read_byte(XXX_IBAT_REG, p_data); 
                *(p_data) &= 0x7F;                                     
                if (ret < 0) break;                                    
                *(p_data) = XXX_SET_BITSLICE(*(p_data), bitname, val);
                ret = XXX_i2c_write_byte(XXX_IBAT_REG, *(p_data));
        } while(0)
 
寄存器地址为:
#define XXX_IBAT_REG                0x04
 
我们要设置的是寄存器的第七位:
#define XXX_RESET__POS              7
#define XXX_RESET__MSK              0x80
#define XXX_RESET__LEN              1      
#define XXX_RESET__REG              XXX_IBAT_REG
 
#define XXX_SET_BITSLICE(regvar, bitname, val)     
                ((regvar & ~bitname##__MSK) |          
                ((val << bitname##__POS) & bitname##__MSK))
 
static int XXX_i2c_read_byte(unsigned char addr, unsigned char *p_data)
{
        int ret;
 
        ret = i2c_smbus_read_byte_data(XXX_chg->client, addr);
        if (ret >= 0){
                *p_data = ret;
                return 0;
        }
 
        return -1;
}
 
static int XXX_i2c_write_byte(unsigned char addr, unsigned char data)
{
        int ret;
 
        ret = i2c_smbus_write_byte_data(XXX_chg->client, addr, data);
        if (ret){
                return -1;
        }
 
        return 0;
}
----------------------------------------------------------------------------
块设备中每扇区的数据长度为512字节,我们在驱动程序经常遇到与此相关的转换。
为了快速运算,我们经常用到9这个常数,比如:
乘以512就是左移9、除以512就是右移9、除以512的余数就是& ((1ULL<<9) - 1)、
向上对齐到512的倍数就是加上(1<<9) - 1再& ~((1ULL<<9) - 1)。
 
simp_blkdev_bytes = (simp_blkdev_bytes + (1<<9) - 1) & ~((1ULL<<9) - 1);
 
#define SIMP_BLKDEV_SECTORSHIFT        (9)
#define SIMP_BLKDEV_SECTORSIZE        (1ULL<
#define SIMP_BLKDEV_SECTORMASK        (~(SIMP_BLKDEV_SECTORSIZE-1))
----------------------------------------------------------------------------
某几位:
#define SMB137B_MASK(BITS, POS)  ((unsigned char)(((1 << BITS) - 1) << POS))
#define CHARGING_STAT_E                 SMB137B_MASK(2, 1)
----------------------------------------------------------------------------
打印内核启动时间(不用包括任何头文件):
 
unsigned long long t;
unsigned long nanosec_rem;
 
t = cpu_clock(0);  // 这里的0改为其他任何整数都可以,原因未调查
nanosec_rem = do_div(t, 1000000000);
printk("[%5lu.lu]n", (unsigned long) t, nanosec_rem / 1000);
 
如果要单独使用其秒数可以这样用:
unsigned long long t;
t = cpu_clock(0);
do_div(t, 1000000000);
现在这个t就可以以秒为单位使用了,它代表系统启动的当前时间。
----------------------------------------------------------------------------
阅读(1834) | 评论(0) | 转发(0) |
0

上一篇:中断-基本概念

下一篇:input子系统

给主人留下些什么吧!~~