(md->val_out & BMSR_LSTATUS) >> 2什么时候小于0
时间: 2024-04-22 10:25:47 浏览: 22
表达式`(md->val_out & BMSR_LSTATUS) >> 2`中,`(md->val_out & BMSR_LSTATUS)`表示对md->val_out和BMSR_LSTATUS进行按位与操作,结果是一个二进制数。然后将结果右移2位,即将二进制数向右移动2位。
当右移操作后的结果小于0时,意味着最高位是1,即结果是一个负数。这是因为在C语言中,右移操作对有符号整数会进行算术右移,保持最高位的符号不变。因此,当最高位为1时,结果会被解释为一个负数。
请注意,在给定的表达式中,具体的情况会取决于md->val_out和BMSR_LSTATUS的值。因此,要确定何时结果小于0,需要知道这两个值的具体取值。
相关问题
if (!val.intval && !pd->pd_connected && typec_mode >= POWER_SUPPLY_TYPEC_SOURCE_DEFAULT) { ret = power_supply_get_property(pd->usb_psy, POWER_SUPPLY_PROP_REAL_TYPE, &val); if (ret) { usbpd_err(&pd->dev, "Unable to read USB TYPE: %d\n", ret); return ret; } if (val.intval == POWER_SUPPLY_TYPE_USB || val.intval == POWER_SUPPLY_TYPE_USB_CDP || val.intval == POWER_SUPPLY_TYPE_USB_FLOAT) { usbpd_dbg(&pd->dev, "typec mode:%d type:%d\n", typec_mode, val.intval); pd->typec_mode = typec_mode; queue_work(pd->wq, &pd->start_periph_work); } return 0; }代码分析
这段代码是一个条件语句,可以将其分为以下几部分进行解释:
1. `!val.intval && !pd->pd_connected && typec_mode >= POWER_SUPPLY_TYPEC_SOURCE_DEFAULT`:这是条件语句的条件部分,表示当`val.intval`和`pd->pd_connected`都为0(即假),并且`typec_mode`大于等于`POWER_SUPPLY_TYPEC_SOURCE_DEFAULT`时,条件成立。
2. `ret = power_supply_get_property(pd->usb_psy, POWER_SUPPLY_PROP_REAL_TYPE, &val);`:如果条件成立,则执行这句代码,读取usb_psy的`POWER_SUPPLY_PROP_REAL_TYPE`属性,并将结果保存在`val`中。
3. `if (ret) {...}`:如果读取属性返回错误,则输出错误信息,并返回错误代码。
4. `if (val.intval == POWER_SUPPLY_TYPE_USB || val.intval == POWER_SUPPLY_TYPE_USB_CDP || val.intval == POWER_SUPPLY_TYPE_USB_FLOAT)`:如果`val.intval`等于`POWER_SUPPLY_TYPE_USB`、`POWER_SUPPLY_TYPE_USB_CDP`或`POWER_SUPPLY_TYPE_USB_FLOAT`中的任意一个,则执行下一步操作。
5. `pd->typec_mode = typec_mode;`:将`typec_mode`的值赋给`pd->typec_mode`。
6. `queue_work(pd->wq, &pd->start_periph_work);`:将`pd->start_periph_work`添加到`pd->wq`工作队列中,等待执行。
7. `return 0;`:返回0表示执行成功。
总的来说,这段代码的作用是在特定条件下,读取`usb_psy`的`POWER_SUPPLY_PROP_REAL_TYPE`属性,并将其值与`POWER_SUPPLY_TYPE_USB`、`POWER_SUPPLY_TYPE_USB_CDP`和`POWER_SUPPLY_TYPE_USB_FLOAT`中的任意一个进行比较,如果匹配成功则将`typec_mode`的值赋给`pd->typec_mode`,并将`pd->start_periph_work`添加到工作队列中等待执行。
case POWER_SUPPLY_PROP_TYPE: if(POWER_SUPPLY_TYPE_WIRELESS == val->intval || ddata->psy_usb_type == POWER_SUPPLY_USB_TYPE_UNKNOWN){ if(ddata->psy_desc.type != POWER_SUPPLY_TYPE_USB_DCP && ddata->psy_desc.type != POWER_SUPPLY_TYPE_USB_CDP && ddata->psy_usb_type != POWER_SUPPLY_USB_TYPE_SDP) ddata->psy_desc.type = val->intval; dev_err(ddata->dev, "%s:set POWER_SUPPLY_TYPE :%d \n",__func__, val->intval); } break;请详细分析一下这段代码
这段代码是在处理电源管理设备属性中的类型(POWER_SUPPLY_PROP_TYPE)。首先,它会检查属性值是否为无线电源(POWER_SUPPLY_TYPE_WIRELESS)或者电源设备的 USB 类型为未知(POWER_SUPPLY_USB_TYPE_UNKNOWN)。
如果是这两种情况之一,它会进入一个条件语句,检查当前电源管理设备描述符(ddata->psy_desc)的类型是否为 USB DCP 类型(POWER_SUPPLY_TYPE_USB_DCP)或者 USB CDP 类型(POWER_SUPPLY_TYPE_USB_CDP),或者 USB 类型不是 SDP 类型(POWER_SUPPLY_USB_TYPE_SDP)。
如果当前电源管理设备描述符的类型不是以上三种类型之一,它会将类型设置为当前属性值(val->intval),并输出一条日志信息。
总之,这段代码的作用是根据电源管理设备属性中的类型来更新电源管理设备描述符中的类型,并输出一条日志信息。
相关推荐
![pth](https://img-home.csdnimg.cn/images/20210720083646.png)
![json](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)