[Android源码分析]bluez中adapter初始化分析

作为一个程序员,咋废话就不多说了,直接看代码吧,哈哈~~

 

2adapter的初始化

gboolean adapter_init(struct btd_adapter *adapter)
{
	int err;

	/* adapter_ops makes sure that newly registered adapters always
	 * start off as powered */
	//置up位,为什么不放到最后在置位啊
	adapter->up = TRUE;
	//读bdaddr,这个就是得到dev的bdaddr到adapter->bdaddr
	adapter_ops->read_bdaddr(adapter->dev_id, &adapter->bdaddr);
	//和BDADDR_ANY比较一下,若是一样就是有问题啦。
	if (bacmp(&adapter->bdaddr, BDADDR_ANY) == 0) {
		error("No address available for hci%d", adapter->dev_id);
		return FALSE;
	}
	//同样的时候拷贝dev的features到adapter的features中
	err = adapter_ops->read_local_features(adapter->dev_id,
							adapter->features);
	if (err < 0) {
		error("Can't read features for hci%d: %s (%d)",
					adapter->dev_id, strerror(-err), -err);
		return FALSE;
	}
	//对应的config文件下,看是否有name,显然是没有的,所以会进入if中
	if (read_local_name(&adapter->bdaddr, adapter->name) < 0)
//adapter->name应该是null了,main_opts.name就是main.conf中的内容了,是%m。这里就是初始化adapter->name的值了。读取的是ro.product.model的值,他在buildinfo.sh定义为PRODUCT_MODEL,而PRODUCT_MODEL就是对应的base.mk中定义的,所以,我们可以在这里改变名字。就是我们见到的8825gc,具体见2-1.
		expand_name(adapter->name, MAX_NAME_LENGTH, main_opts.name,
							adapter->dev_id);
//是否支持gatt,显然目前我们并不支持
	if (main_opts.attrib_server)
		attrib_gap_set(GATT_CHARAC_DEVICE_NAME,
			(const uint8_t *) adapter->name, strlen(adapter->name));
//初始化service list,就是把开始的那些service record和adapter这边关联起来。见2-2
	sdp_init_services_list(&adapter->bdaddr);
//就是加载那些plugin的adpater driver,见2-3分析
	load_drivers(adapter);
//清除block列表
	clear_blocked(adapter);
//加载device,就是创建一系列的文件,见2-4分析
	load_devices(adapter);
	/* Set pairable mode */
	//读config文件下的pairable的值,若是没有读到就设为true,否则就是读到的值
	if (read_device_pairable(&adapter->bdaddr, &adapter->pairable) < 0)
		adapter->pairable = TRUE;

	/* retrieve the active connections: address the scenario where
	 * the are active connections before the daemon've started */
	 //得到active的connection
	load_connections(adapter);
	//initialized设为true
	adapter->initialized = TRUE;

	return TRUE;
}

2-1 expand_name分析

expand_name就是扩展名字了。这里ANDROID_EXPAND_NAME是必然会定义了的

static char *expand_name(char *dst, int size, char *str, int dev_id)
{
	register int sp, np, olen;
	char *opt, buf[10];

#ifdef ANDROID_EXPAND_NAME
	char value[PROPERTY_VALUE_MAX];
#endif
//这里当然不是null了
	if (!str || !dst)
		return NULL;

	sp = np = 0;
	while (np < size - 1 && str[sp]) {
		switch (str[sp]) {
		case '%':
			opt = NULL;

			switch (str[sp+1]) {
			case 'd':
……
//我们是%m,所以会走到这里
#ifdef ANDROID_EXPAND_NAME
			case 'b':
				property_get("ro.product.brand", value, "");
				opt = value;
			break;
//得到ro.product.model的值
			case 'm':
				property_get("ro.product.model", value, "");
				opt = value;
			break;
……
#endif

			case '%':
				dst[np++] = str[sp++];
				/* fall through */
			default:
				sp++;
				continue;
			}

			if (opt) {
				/* substitute */
	//保存到adapter.name中
				olen = strlen(opt);
				if (np + olen < size - 1)
					memcpy(dst + np, opt, olen);
				np += olen;
			}
			sp += 2;
			continue;

		case '\\':
			sp++;
			/* fall through */
		default:
			dst[np++] = str[sp++];
			break;
		}
	}
	dst[np] = '\0';
	return dst;
}


 

2-2 sdp_init_services_list

这个函数主要就是把开始的service record和对应的adapter关联起来

void sdp_init_services_list(bdaddr_t *device)
{
	sdp_list_t *p;

	DBG("");
//access_db就是开始那边sdp record会加入的
	for (p = access_db; p != NULL; p = p->next) {
		sdp_access_t *access = p->data;
		sdp_record_t *rec;

		if (bacmp(BDADDR_ANY, &access->device))
			continue;
	//得到对应的sdp record
		rec = sdp_record_find(access->handle);
		if (rec == NULL)
			continue;

		SDPDBG("adding record with handle %x", access->handle);
	//加入到每一个adapter中,这里其实也就是一个了
	//这里其实就是会调用adapter_service_insert函数
		manager_foreach_adapter(adapter_service_insert, rec);
	}
}
void adapter_service_insert(struct btd_adapter *adapter, void *r)
{
	sdp_record_t *rec = r;
	gboolean new_uuid;
	//看adapter services中是否已经有了该uuid
	if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
		new_uuid = TRUE;
	else
		new_uuid = FALSE;
	//把这个rec加入到adapter services中
	adapter->services = sdp_list_insert_sorted(adapter->services, rec,
								record_sort);

	if (new_uuid) {
		//add uuid,新的uuid,则需要调用hciops中的add uuid
		uint8_t svc_hint = get_uuid_mask(&rec->svclass);
		//调用hciops对应的add_uuid,就是下面的hciops_add_uuid
		adapter_ops->add_uuid(adapter->dev_id, &rec->svclass, svc_hint);
	}
	//因为adapter还没有初始化完成,所以这个不会做什么,直接return而已
	adapter_emit_uuids_updated(adapter);
}
static int hciops_add_uuid(int index, uuid_t *uuid, uint8_t svc_hint)
{
	struct dev_info *dev = &devs[index];
	struct uuid_info *info;

	DBG("hci%d", index);
	//新建一个uuid info用来保存这个新的uuid
	info = g_new0(struct uuid_info, 1);
	memcpy(&info->uuid, uuid, sizeof(*uuid));
	info->svc_hint = svc_hint;
	//加入到dev->uuids列表中
	dev->uuids = g_slist_append(dev->uuids, info);

	return update_service_classes(index);
}
static int update_service_classes(int index)
{
	struct dev_info *dev = &devs[index];
	uint8_t value;
	int err;
	//uuid对应的service class集合
	value = generate_service_class(index);

	DBG("hci%d value %u", index, value);

	/* Update only the service class, keep the limited bi
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值