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),即右移一位
因为内核到时候会左移一位,得到真地址。