(sizeof(XAxiDma_Bd) + (0x40- 1)) & ~(0x40- 1); 分析
时间: 2023-08-22 22:08:06 浏览: 43
这段代码对 `XAxiDma_Bd` 结构体的大小进行了计算,并进行了对齐操作。
首先,`sizeof(XAxiDma_Bd)` 计算了 `XAxiDma_Bd` 结构体的大小。
然后,`(0x40 - 1)` 表示对齐的字节数,这里假设为64字节。
接下来,`(sizeof(XAxiDma_Bd) + (0x40 - 1))` 计算了原始大小加上对齐字节数的结果。
最后,`~(0x40 - 1)` 对 `(sizeof(XAxiDma_Bd) + (0x40 - 1))` 进行按位取反操作,即将最低的6位设置为0,实现了以64字节对齐的效果。
总结起来,这段代码的作用是计算 `XAxiDma_Bd` 结构体的大小,并将其按照64字节对齐。
相关问题
int dsi_panel_set_backlight(struct dsi_panel panel, u32 bl_lvl) { int rc = 0; struct dsi_backlight_config bl = &panel->bl_config; if (panel->host_config.ext_bridge_mode) return 0; DSI_DEBUG("backlight type:%d lvl:%d\n", bl->type, bl_lvl); switch (bl->type) { case DSI_BACKLIGHT_WLED: rc = backlight_device_set_brightness(bl->raw_bd, bl_lvl); break; case DSI_BACKLIGHT_DCS: rc = dsi_panel_update_backlight(panel, bl_lvl); break; case DSI_BACKLIGHT_EXTERNAL: rc = lcd_bl_set_led_brightness(bl_lvl); //pr_err("dsi set bias brightness: %d\n", bl_lvl); rc = lcd_bias_set_led_brightness(bl_lvl); //pr_err("dsi set brightness: %d\n", bl_lvl); break; case DSI_BACKLIGHT_PWM: rc = dsi_panel_update_pwm_backlight(panel, bl_lvl); break; default: DSI_ERR("Backlight type(%d) not supported\n", bl->type); rc = -ENOTSUPP; } return rc; } int lcd_bl_set_led_brightness(int value)//for set bringhtness { dev_warn(&lcd_bl_i2c_client->dev, "lcm 8866 bl = %d\n", value); if (value < 0) { dev_warn(&lcd_bl_i2c_client->dev, "value=%d\n", value); return 0; } if (value > 0) { lcd_bl_write_byte(KTZ8866_DISP_BB_LSB, value & 0x07);// lsb lcd_bl_write_byte(KTZ8866_DISP_BB_MSB, (value >> 3) & 0xFF);// msb lcd_bl_write_byte(KTZ8866_DISP_BL_ENABLE, 0x4F); / BL enabled and Current sink 1/2/3/4 enabled;/ } else { lcd_bl_write_byte(KTZ8866_DISP_BB_LSB, 0x00);// lsb lcd_bl_write_byte(KTZ8866_DISP_BB_MSB, 0x00);// msb lcd_bl_write_byte(KTZ8866_DISP_BL_ENABLE, 0x00); /* BL enabled and Current sink 1/2/3/4 disabled;/ } return 0; } int lcd_bias_set_led_brightness(int value)//for set bringhtness { dev_warn(&lcd_bl_bias_i2c_client->dev, "lcm 8866 bl = %d\n", value); if (value < 0) { dev_warn(&lcd_bl_bias_i2c_client->dev, "invalid value=%d\n", value); return 0; } if (value > 0) { lcd_bl_bias_write_byte(KTZ8866_DISP_BB_LSB, value & 0x07);// lsb lcd_bl_bias_write_byte(KTZ8866_DISP_BB_MSB, (value >> 3) & 0xFF);// msb lcd_bl_bias_write_byte(KTZ8866_DISP_BL_ENABLE, 0x4F); / BL enabled and Current sink 1/2/3/4 enabled;/ } else { lcd_bl_bias_write_byte(KTZ8866_DISP_BB_LSB, 0x00);// lsb lcd_bl_bias_write_byte(KTZ8866_DISP_BB_MSB, 0x00);// msb lcd_bl_bias_write_byte(KTZ8866_DISP_BL_ENABLE, 0x00); / BL enabled and Current sink 1/2/3/4 disabled;*/ } return 0; } dsi_panel_set_backlight、lcd_bl_set_led_brightness和lcd_bias_set_led_brightness源码如上,帮忙用工作队列的方式,同时实现在case DSI_BACKLIGHT_EXTERNAL:下并发执行lcd_bl_set_led_brightness和lcd_bias_set_led_brightness两个函数
好的,我可以为您提供一个使用工作队列来实现并发执行`lcd_bl_set_led_brightness`和`lcd_bias_set_led_brightness`的示例代码。具体实现方法如下:
1. 定义一个工作结构体`struct work_struct`,并在其中传递参数。
```
struct backlight_work {
struct work_struct work;
struct i2c_client *lcd_bl_i2c_client;
struct i2c_client *lcd_bl_bias_i2c_client;
int value;
};
```
2. 定义工作队列。
```
static struct workqueue_struct *bl_workqueue;
```
3. 在`dsi_panel_set_backlight`函数中,将`lcd_bl_set_led_brightness`和`lcd_bias_set_led_brightness`函数的调用封装成一个工作任务,并将任务推入工作队列。
```
case DSI_BACKLIGHT_EXTERNAL:
{
struct backlight_work *bl_work;
bl_work = kzalloc(sizeof(*bl_work), GFP_KERNEL);
if (!bl_work)
return -ENOMEM;
INIT_WORK(&bl_work->work, backlight_worker);
bl_work->lcd_bl_i2c_client = lcd_bl_i2c_client;
bl_work->lcd_bl_bias_i2c_client = lcd_bl_bias_i2c_client;
bl_work->value = bl_lvl;
queue_work(bl_workqueue, &bl_work->work);
break;
}
```
4. 在`backlight_worker`函数中,实现`lcd_bl_set_led_brightness`和`lcd_bias_set_led_brightness`函数的并发执行。
```
static void backlight_worker(struct work_struct *work)
{
struct backlight_work *bl_work = container_of(work, struct backlight_work, work);
int value = bl_work->value;
if (value < 0) {
dev_warn(&bl_work->lcd_bl_i2c_client->dev, "invalid value=%d\n", value);
} else if (value > 0) {
lcd_bl_write_byte(KTZ8866_DISP_BB_LSB, value & 0x07);
lcd_bl_write_byte(KTZ8866_DISP_BB_MSB, (value >> 3) & 0xFF);
lcd_bl_write_byte(KTZ8866_DISP_BL_ENABLE, 0x4F);
lcd_bl_bias_write_byte(KTZ8866_DISP_BB_LSB, value & 0x07);
lcd_bl_bias_write_byte(KTZ8866_DISP_BB_MSB, (value >> 3) & 0xFF);
lcd_bl_bias_write_byte(KTZ8866_DISP_BL_ENABLE, 0x4F);
} else {
lcd_bl_write_byte(KTZ8866_DISP_BB_LSB, 0x00);
lcd_bl_write_byte(KTZ8866_DISP_BB_MSB, 0x00);
lcd_bl_write_byte(KTZ8866_DISP_BL_ENABLE, 0x00);
lcd_bl_bias_write_byte(KTZ8866_DISP_BB_LSB, 0x00);
lcd_bl_bias_write_byte(KTZ8866_DISP_BB_MSB, 0x00);
lcd_bl_bias_write_byte(KTZ8866_DISP_BL_ENABLE, 0x00);
}
kfree(bl_work);
}
```
这样,当`dsi_panel_set_backlight`函数中调用`lcd_bl_set_led_brightness`和`lcd_bias_set_led_brightness`时,会将其封装成一个工作任务并推入工作队列中,`backlight_worker`函数实现这两个函数的并发执行。
void sl_notify_gap_evt_to_porting_layer(sl_bt_msg_t *evt) { sl_status_t sc; bd_addr address; uint8_t address_type; struct ble_gap_event event; memset(&event, 0, sizeof(event)); switch (SL_BT_MSG_ID(evt->header)) { // ------------------------------- // This event is generated when an advertisement packet or a scan response // is received from a responder case sl_bt_evt_scanner_legacy_advertisement_report_id: memset(&event, 0, sizeof(event)); event.type = BLE_GAP_EVENT_DISC; event.disc.event_type = convert_to_nimble_adv_type(evt->data.evt_scanner_legacy_advertisement_report.event_flags); event.disc.length_data = evt->data.evt_scanner_legacy_advertisement_report.data.len; event.disc.data = evt->data.evt_scanner_legacy_advertisement_report.data.data; event.disc.addr.type = evt->data.evt_scanner_legacy_advertisement_report.address_type; memcpy(event.disc.addr.val, evt->data.evt_scanner_legacy_advertisement_report.address.addr, 6); event.disc.rssi = evt->data.evt_scanner_legacy_advertisement_report.rssi; notify_ble_event_to_listeners(&event); break; // ------------------------------- // This event indicates that a new connection was opened. case sl_bt_evt_connection_opened_id: event.type = BLE_GAP_EVENT_CONNECT; event.connect.conn_handle = evt->data.evt_connection_opened.connection; app_log_info("BLE connected, conn_id:%d\n", event.connect.conn_handle); notify_ble_event_to_listeners(&event); break; // ------------------------------- // This event indicates that a connection was closed. case sl_bt_evt_connection_closed_id: event.type = BLE_GAP_EVENT_DISCONNECT; event.disconnect.conn.conn_handle = evt->data.evt_connection_closed.connection; event.disconnect.reason = evt->data.evt_connection_closed.reason; app_log_info("BLE disconnected, conn_id:%d, reason:0x%02x\n", event.disconnect.conn.conn_handle, event.disconnect.reason); notify_ble_event_to_listeners(&event); break; case sl_bt_evt_gatt_mtu_exchanged_id: event.type = BLE_GAP_EVENT_MTU; event.mtu.conn_handle = evt->data.evt_gatt_mtu_exchanged.connection; event.mtu.value = evt->data.evt_gatt_mtu_exchanged.mtu; app_log_info("exchange mtu req: %d\n", event.mtu.value); notify_ble_event_to_listeners(&event); break; default: break; } }
这是一个函数的具体实现,实现了将 GAP 事件通知到 porting layer 的功能。函数接收一个 `sl_bt_msg_t` 类型的指针作为参数,根据不同的 GAP 事件类型,将事件转换成 nimble 的 BLE GAP 事件,然后通知给监听器进行处理。其中,不同的 GAP 事件类型包括扫描响应、连接建立、连接断开、MTU 交换等。通过这个函数,可以将不同的 GAP 事件转换成标准的 BLE GAP 事件,方便上层应用进行处理。具体实现细节可以参考代码注释。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.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)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)