天天看點

Kernel中Hid和Bnep的初始化

         有了前面的L2CAP,RFCOMM的初始化分析,再來分析Hid和Bnep的代碼就輕松很多了。基本來說,這兩個protol沒有太多的新意,直接看代碼就可以看出來了。

static int __init hidp_init(void)
{
	int ret;
	BT_INFO("HIDP (Human Interface Emulation) ver %s", VERSION);
//注冊了一個hid的driver,hidp_driver見下面
	//其實就是把該driver加載到hid的bus總線上去,通過name進行區分。
	//這裡的name是generic-bluetooth,後期用到我們再來具體分析
	ret = hid_register_driver(&hidp_driver);
	if (ret)
		goto err;
	//也就是在proto_list中加入了hid
	//初始化了bt_proto中的BTPROTO_HIDP的值。
	//是以總的來說沒有什麼好講的
	ret = hidp_init_sockets();
	if (ret)
		goto err_drv;

	return 0;
err_drv:
	hid_unregister_driver(&hidp_driver);
err:
	return ret;
}

static const struct hid_device_id hidp_table[] = {
	{ HID_BLUETOOTH_DEVICE(HID_ANY_ID, HID_ANY_ID) },
	{ }
};
//主要就是一個name,是generiv-bluetooth
static struct hid_driver hidp_driver = {
	.name = "generic-bluetooth",
	.id_table = hidp_table,
};
           

對于bnep的初始化,其實看起來也比較簡單哦:

static int __init bnep_init(void)
{
	char flt[50] = "";

//根據選項,初始化flt數組
#ifdef CONFIG_BT_BNEP_PROTO_FILTER
	strcat(flt, "protocol ");
#endif

#ifdef CONFIG_BT_BNEP_MC_FILTER
	strcat(flt, "multicast");
#endif

	BT_INFO("BNEP (Ethernet Emulation) ver %s", VERSION);
	if (flt[0])
		BT_INFO("BNEP filters: %s", flt);
//和上面的hid是一樣的,隻是換了個名字而已
	bnep_sock_init();
	return 0;
}
           

總的來說,這兩個proto基本沒有什麼新的内容,權當對《kernel中bluetooth的初始化》這篇文章的補充吧。至此,曉東對kernel中bluetooth statck相關初始化的内容已經全部解釋清楚了。大家也許對這些内容有何作用暫時還比較迷茫,不過沒有關系,在後面的藍牙各個操作中,我們會一一為大家揭曉。