ARM 驱动一些小结

ARM 155浏览

1.各子系统都是由各部分组合而成,使用前,记得把内核那部分编译进内核。

2. 平台设备驱动

struct platform_device led_dev= {
.name  = "s3c2410-led",
.id  = -1,
.num_resources = ARRAY_SIZE(led_resource),
.resource
 = led_resource,
.dev              = {
.release = led_release,        //这个函数即使为空,也必须写,因为内核会调用,如果没有,卸载时会出错。
}
};

void led_release(struct device *dev)  //即便为空,也要定义
{
;
}

3.内核定时器

init_timer(&keyboard_timer);
keyboard_timer.expires = jiffies + 5;
keyboard_timer.function = keyboard_timer_func;
add_timer(&keyboard_timer);          //在加载之后,很短时间就会运行,并跳入定时器处理函数,此时,内核处理函数的指针,要注意是否为空

static void keyboard_timer_func(unsigned long data)
{
int key_val,i,col_value = -1;

if(!cur_pin)//判断是否为空

{
printk("leave timer!n");
return 0;
}

key_val = s3c2410_gpio_getpin(cur_pin->pin);
if(key_val == 1)
。。。。。

}

4.输入子系统:

input_event(keyboard_input, EV_KEY, key_value, 2);  //如果不判断按下按上,要写2,否则不能向上发送
input_sync(keyboard_input);   //同步信号,不能少

 

5.i2c子系统:

由于I2C 用八位传地址,其中最后一位是方向位(读/写),所以实际地址为七位,内核也是用这七位左移得到八位真地址,

所以如果一个I2C设备物理地址是0xa0 (1010 0000),  构建地址是要写成 0x50 (0101 0000),即右移一位

因为内核到时候会左移一位,得到真地址。