从基类class继承,就可以包含那些共性操作集,
然后只需要在衍生类中,封装特定的操作集,就可以了。
class BayerPhotoAxim : public XhlsAccl
{
public:
BayerPhotoAxim(u32 phy_base, u32 size) : XhlsAccl(phy_base, size) {}
void set_ddr_base(u32 value) {
regs_.set_value(4, value);
}
void set_param(u32 width, u32 height, u32 sensor_width, u32 sensor_height) {
width = (width / 16) * 16;
u32 x = (sensor_width - width) / 2;
u32 y = (sensor_height - height) / 2;
set_crop_x(x);
set_crop_y(y);
set_crop_width(width);
set_crop_height(height);
}
void set_crop_x(u32 value) {
crop_x_ = value;
regs_.set_value(6, crop_x_ );
}
void set_crop_y(u32 value) {
crop_y_ = value;
regs_.set_value(8, crop_y_ );
}
void set_crop_width(u32 value) {
crop_width_ = value;
regs_.set_value(10, crop_width_ );
}
void set_crop_height(u32 value) {
crop_height_ = value;
regs_.set_value(12, crop_height_ );
}
void set_width(u32 value) {
width_ = value;
regs_.set_value(14, width_ );
}
void set_height(u32 value) {
height_ = value;
regs_.set_value(16, height_ );
}
public:
u32 crop_x_;
u32 crop_y_;
u32 crop_width_;
u32 crop_height_;
u32 width_;
u32 height_;
};
一方面,将传入的参数在本地保存一份副本,另一方面,将传入的参数通过IOMEM发送到AXI总线上去。
对应的,来看看BSP中的driver中对应的操作集,
void XBayer_photo_accl_Set_crop_x(XBayer_photo_accl *InstancePtr, u32 Data) {
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
XBayer_photo_accl_WriteReg(InstancePtr->Control_bus_BaseAddress, XBAYER_PHOTO_ACCL_CONTROL_BUS_ADDR_CROP_X_DATA, Data);
}
void XBayer_photo_accl_Set_crop_y(XBayer_photo_accl *InstancePtr, u32 Data) {
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
XBayer_photo_accl_WriteReg(InstancePtr->Control_bus_BaseAddress, XBAYER_PHOTO_ACCL_CONTROL_BUS_ADDR_CROP_Y_DATA, Data);
}
void XBayer_photo_accl_Set_crop_width(XBayer_photo_accl *InstancePtr, u32 Data) {
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
XBayer_photo_accl_WriteReg(InstancePtr->Control_bus_BaseAddress, XBAYER_PHOTO_ACCL_CONTROL_BUS_ADDR_CROP_WIDTH_DATA, Data);
}
void XBayer_photo_accl_Set_crop_height(XBayer_photo_accl *InstancePtr, u32 Data) {
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
XBayer_photo_accl_WriteReg(InstancePtr->Control_bus_BaseAddress, XBAYER_PHOTO_ACCL_CONTROL_BUS_ADDR_CROP_HEIGHT_DATA, Data);
}
void XBayer_photo_accl_Set_width(XBayer_photo_accl *InstancePtr, u32 Data) {
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
XBayer_photo_accl_WriteReg(InstancePtr->Control_bus_BaseAddress, XBAYER_PHOTO_ACCL_CONTROL_BUS_ADDR_WIDTH_DATA, Data);
}
void XBayer_photo_accl_Set_height(XBayer_photo_accl *InstancePtr, u32 Data) {
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
XBayer_photo_accl_WriteReg(InstancePtr->Control_bus_BaseAddress, XBAYER_PHOTO_ACCL_CONTROL_BUS_ADDR_HEIGHT_DATA, Data);
}