[1]レビュー
1.割り込み
request_irq(irqno、割り込み処理関数、割り込みトリガーメソッド、名前、渡されたパラメーター);
free_irq(irqno、渡されたパラメーター);
2.内核定时
struct timer_list mytimer;
mytimer.expires = jiffies + HZ; (1s) //# define HZ CONFIG_HZ
mytimer.function = timer_function; //当定时时间到了会执行
mytimer.data = 0; //一般用于传递下一次的定时的时间
init_timer(&mytimer);
add_timer(&mytimer); //启动定时器,并只会执行一次
mod_timer(&mytimer,下一次定时的时间);再次启动定时器
del_timer(&mytimer);
3.gpio子系统
gpio_request(gpio,NULL);
gpio_direction_input(gpio);
gpio_driection_output(gpio,value);
gpio_set_value(gpio,value);
gpio_get_value(gpio);
gpio_free(gpio);
4.中断底半部
软中断,tasklet ,工作队列
tasklet:
struct tasklet_struct tasklet;
tasklet_init(&tasklet,tasklet底半部处理函数,传递的参数);
tasklet_schedule(struct tasklet_struct *tasklet)
工作队列:
struct work_struct work;
INIT_WORK(&work, 工作队列的底半部处理函数);
schedule_work(&work);
作业:
1.编写ADC的驱动(使用中断)
[2]コントローラーのソフト割り込み番号を取得する方法
find -name irqs.h
./arch/arm/mach-s5p6818/include/mach/irqs.h
#include "s5p6818_irq.h"
find -name s5p6818_irq.h
./arch/arm/mach-s5p6818/include/mach/s5p6818_irq.h
#define IRQ_PHY_ADC (41 + 32) //ADC的软中断号
[3]プラットフォームバスドライバー
プラットフォーム:デバイスドライバーからデバイス情報を分離して、このデバイスドライバーの一般的な目的を実現します。
デバイス情報とデバイスドライバーは、プラットフォームバスを通じてマッチングプロセスを完了します。デバイス情報
をデバイスドライバーの名前と照合することにより、照合が成功すると、デバイス情報端末は
デバイスドライバーに情報を伝達し、デバイスドライバーでプローブ機能を実行し、プローブ機能でハードウェアを操作します
。デバイス情報がデバイスドライバから分離されている場合は、ドライバで削除機能を実行してください。
----------------------------------------------------
| |
设备信息端 | platform总线端 |设备驱动端
驱动工程师实现的|内核工程师实现的|驱动工程师实现的
| |
----------------------------------------------------
设备信息端 :
1.分配对象
struct platform_device {
const char * name;
int id;
struct device dev;
u32 num_resources;
struct resource * resource;
};
struct platform_device pdev;
2.对象的初始化
pdev.name 名字,用户匹配
pdev.id -1,platform是内核制作出来的,没有真实的硬件存在,填写-1(序号)
pdev.num_resources 资源的个数
pdev.resource 描述的资源
struct resource { //设备信息结构体
resource_size_t start; //起始的资源,需要填写
resource_size_t end; //结束的资源,需要填写
const char *name; //名字
unsigned long flags; //资源的类型,需要填写
struct resource *parent, *sibling, *child; //内核链表
};
#define IORESOURCE_IO 0x00000100 IO口资源
#define IORESOURCE_MEM 0x00000200 内存资源
#define IORESOURCE_IRQ 0x00000400 中断资源
#define IORESOURCE_DMA 0x00000800 DMA资源
pdev.dev.release = 释放资源的函数、如果不写卸载驱动的时候会崩溃
void (*release)(struct device *dev);
3.对象的注册
int platform_device_register(struct platform_device *pdev);
4.对象注销
void platform_device_unregister(struct platform_device *pdev)
设备驱动端 :
1.分配对象
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
struct device_driver driver;
const struct platform_device_id *id_table;
};
struct platform_driver pdrv;
2.对象的初始化
pdrv.probe=pdrv_probe //匹配成功执行的函数
pdrv.remove = pdrv_remove //分离的时候执行的函数
pdrv.driver.name //1.用于匹配的名字
pdrv.id_table //2.用于匹配的
//pdrv.driver.of_match_table//3.设备树匹配
3.对象的注册
platform_driver_register(&pdrv);
4.对象注销
platform_driver_unregister(&pdrv);
[4]関数
struct resource * platform_get_resource(struct platform_device * dev、
unsigned int type、unsigned int num)
は、ドライバー側のデバイス情報を取得します。関数:ドライバー側のデバイス情報を取得します。
パラメーター:
@dev:デバイス側オブジェクトへのポインター@type
:リソースタイプ
@num:同じ種類のリソースの数。各リソースは0から始まります。
戻り値:成功した場合は構造体リソース*の構造体ポインタを返し、
失敗した場合はNULL
int platform_get_irq(struct platform_device * dev、unsigned int num)
機能:割り込みリソースを取得
パラメータ:
@dev:デバイス側オブジェクトのポインタ
@num:割り込みリソースの数。各リソースは0から始まります。
戻り値:成功すると割り込み番号が返され、失敗するとエラーコードが返されます
[5] id_tableの一致するメソッド
struct platform_device_id { char name [PLATFORM_NAME_SIZE]; // kernel_ulong_t driver_dataの一致に使用される名前//渡されたデータ、0を気にしない場合};
struct platform_device_id pdrv_idtable[] = {
{"hello_adc",},
{"hello_adc0",},
{"hello_adc1",},
{"hello_adc2",},
{/*结束*/}, //如果不写这个空的花括号,内核在比较名字的时候
}; //有可以会一直循环着比较,如果碰巧匹配上了有可能导致内核崩溃
如果驱动中既有idtable又有名字,匹配的优先级是先匹配idtale如果idtable
没有匹配上然后去匹配名字。
【6】module_platform_driver
功能#define module_platform_driver(pdrv)
module_driver(pdrv、platform_driver_register、platform_driver_unregister)
#define module_driver(__ driver、__register、__unregister、…)
static int __init pdrv_init(void)
{ return platform_driver_register(&pdrv); } module_init(pdrv_init); static void __exit pdrv_exit(void){ platform_driver_unregister(&pdrv); } module_exit(pdrv_exit);
[7] i2cハードウェア知識のレビュー
1.複数のライン
scl:クロックライン
sda:データライン
2.いくつかの種類の信号
開始信号:
sclがハイのとき、sdaはハイからローにジャンプします
ストップ信号:
でsclがハイのとき、sdaはローからハイに変化します
応答信号:
sdaはロー
3. 2つのタイミング
書き込みタイミング:
開始+ 7bitスレーブアドレス(0書き込み)+ ack + reg(8bit)+ ack + data + ack + stop
读时序:
start +7bit从机地址(0写)+ack+reg(8bit)+ack+
start +7bit从机地址(1读)+ack+从机给主机反馈data+NO ack+stop
4.i2c传输速率
100K 400K 3.4M