----------------------------------------------------------------------------
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就可以以秒为单位使用了,它代表系统启动的当前时间。
----------------------------------------------------------------------------
阅读(1842) | 评论(0) | 转发(0) |