kernel boot 过程,设备树初始化 reserved-memory 节点: early_init_fdt_scan_reserved_mem() fdt_scan_reserved_mem(); fdt_init_reserved_mem(); static int __init fdt_scan_reserved_mem(void) { int node, child; const void *fdt = initial_boot_params; node = fdt_path_offset(fdt, "/reserved-memory"); fdt_for_each_subnode(child, fdt, node) { const char *uname; int err; if (!of_fdt_device_is_available(fdt, child)) continue; uname = fdt_get_name(fdt, child, NULL); /// 存在 reg 属性的情况 err = __reserved_mem_reserve_reg(child, uname); /// 不存在 reg 属性的情况,存在 size 属性 if (err == -ENOENT && of_get_flat_dt_prop(child, "size", NULL)) fdt_reserved_mem_save_node(child, uname, 0, 0); } return 0; } /// 先预留 rmem 的 base 和 size 都为 0 void __init fdt_reserved_mem_save_node(unsigned long node, const char *uname, phys_addr_t base, phys_addr_t size) { struct reserved_mem *rmem = &reserved_mem[reserved_mem_count]; rmem->fdt_node = node; rmem->name = uname; rmem->base = base; rmem->size = size; reserved_mem_count++; return; } void __init fdt_init_reserved_mem(void) { int i; for (i = 0; i < reserved_mem_count; i++) { struct reserved_mem *rmem = &reserved_mem[i]; unsigned long node = rmem->fdt_node; int len; const __be32 *prop; int err = 0; bool nomap; nomap = of_get_flat_dt_prop(node, "no-map", NULL) !...
Posts
Data Structure struct software_node { const char *name; const struct software_node *parent; const struct property_entry *properties; }; struct swnode { struct kobject kobj; struct fwnode_handle fwnode; const struct software_node *node; int id; /* hierarchy */ struct ida child_ids; struct list_head entry; struct list_head children; struct swnode *parent; unsigned int allocated:1; unsigned int managed:1; }; Provider software_node_register()注册单个 software node, software_node_register_node_group()注册一组 software nodes. 都是将 software nodes 挂入一个全局链表. // 定义属性 static const struct property_entry my_device_properties[] = { PROPERTY_ENTRY_U32("reg", 0), PROPERTY_ENTRY_U32("my_property", 1234), { } }; // 定义 software node static const struct software_node my_device_node = { ....
IPCam 3917 isp 模块图: 信号处理路径模块: Crop:裁剪模块,用于裁剪图像的特定区域 BLC:黑电平补偿(Black level Correction) DPC: 坏点校正(Defect Pixel Correction) 2DNR: 2D降噪(2D Noise Reduction) GE: 边缘增强(Gain Enhancement) 3DNR & GE:3D降噪和增益增强 AE Short/Long Gain:自动曝光短/长时间增益控制 HDR Fusion:高动态范围图像融合,合并不同曝光的图像 镜头校正模块: Circle Lens Shading:圆形镜头阴影校正 Grid Lens Shading:网格镜头阴影校正 色彩处理模块: YUV to RGB:YUV色彩空间转换为RGB INTP:demosaic颜色插值, 从raw格式转换到rgb格式 CCM:色彩校正矩阵(Color Correction Matrix) RGB Gamma:RGB伽马校正 WDR:宽动态范围(Wide Dynamic Range)处理 YUV处理模块: YUV420 To YUV422:YUV色彩格式转换 YUV422 To YUV444:YUV色彩格式转换 RGB2YUV444:RGB转YUV444格式 Global Curve:全局曲线调整 UV Tune & UVS:UV通道调整和UV抑制 统计和分析模块: AF Statistics:自动对焦统计数据 AE Short/Long Statistics:自动曝光短/长时间统计数据 Raw Statistics:原始图像统计数据...
libisp api: global api: rts_av_isp_init/cleanup rts_av_isp_start/stop rts_av_isp_get_status rts_av_isp_register/unregister/get_algo rts_av_isp_bind/unbind_algo rts_av_isp_register/unregister/get/check_sensor rts_av_isp_bind/unbind_sensor rts_av_isp_register_iq mipi out api: rts_av_isp_set_mipiout rts_av_isp_get_mipiout v4l2 control: rts_isp_v4l2_query_ctrl rts_isp_v4l2_query_menu rts_isp_v4l2_g_ctrl rts_isp_v4l2_s_ctrl rts_isp_v4l2_query_ext_ctrl rts_isp_v4l2_g_ext_ctrls rts_isp_v4l2_s_ext_ctrls rts_isp_v4l2_try_ext_ctrls sensor: private mask: 3A Setting: 3A Statis: IQ tuning: other: struct isp_core { struct isp_mod_hash_table hash; struct isp_notify notify; struct v4l2_ctrl_handler ctrl_handler; struct isp_statis statis; struct isp_iq iq; int initialized:1; int running:1; }; hash: hash table, 用来保存 modules. notify: ctrl_hander: statis: iq: initialized: isp_core_init() 之后置 1....
Chapter 2 Terminology Lane: 单向物理传输 lane, 2(D-PHY) or 3(C-PHY) wire interface for clock or data transmission. Virtual channel: 逻辑层面的概念,每个虚拟通道的数据彼此独立,在 lane 上交错发送,包含标识信息,指明属于哪个外设/通道。 Chapter 7 Physical Layer 有两种 physical layer,D-PHY 和 C-PHY, transmitter 和 receiver 需要一致。 7.1 D-PHY Physical Layer option D-PHY 由多条单向的 data lanes 和一条 clk lane。 对于 clk lane, transmitter 和 receiver 必须实现 continuous clock,non-continuous clock 是可选的。 continuous clk: 保持在 high-speed mode. non-continuous clk: 在两笔数据包之间进入 LP-11 state. 7.2 C-PHY Physical Layer option Chapter 9 Low Level Protocol Features:...
struct rtscam_soc_dev { struct device *dev; void __iomem *base; unsigned long iostart; unsigned int iosize; int initialized; atomic_t init_count; const struct vb2_mem_ops *mem_ops; struct rtscam_sensor_fps sensor_fps; struct rtscam_video_device rvdev; struct rtscam_soc_slot_info slot_info[RTSCAM_MAX_STM_COUNT]; struct rtscam_ge_device *mem_dev; struct rtscam_ge_device *cam_dev; struct rtscam_ge_device *ctrl_dev; struct rtscam_region td_config; struct rtscam_soc_icfg icfgs[RTSCAM_YUV_MAX_STRM_NUM]; unsigned int icfg_count; struct rtscam_soc_rgbcfg rgbcfg; char name[PLATFORM_NAME_SIZE]; kernel_ulong_t devtype; struct rtscam_mem_info *rtsmem; int pause_flag; unsigned long drop_frames; unsigned long drops[RTSCAM_MAX_STM_COUNT]; int keep_user_setting; struct rtscam_subdev_t *subdev; struct rtscam_soc_video_in *video_in; }; initialized: 是否初始化....
v4l-ctl media-ctl media-ctl.c -p: 打印 device topology $ media-ctl -p --print-dot: 输出 graphviz DOT 格式图形描述。 # 将输出保存到文件并转换为图像 $ media-ctl --print-dot > topology.dot $ dot -Tpng topology.dot -o topology.png -e: 指定某个 entity name, 打印属于哪个 device $ media-ctl -e rtsisp_video0 /dev/video0 --get-v4l2 or --get-format: 查看某个 pad 的格式 # 使用entity ID $ media-ctl --get-v4l2 0:1 # entity 0的pad 1 $ media-ctl --get-v4l2 5:0 # entity 5的pad 0 # 使用entity 名称 $ media-ctl --get-v4l2 '"sensor":1' # 名为"sensor"的entity的pad 1 $ media-ctl --get-v4l2 '"isp":0' # 名为"isp"的entity的pad 0 -r: reset all links to inactive...
Syntax --- title: Bank example --- classDiagram class BankAccount BankAccount : +String owner BankAccount : +Bigdecimal balance BankAccount : +deposit(amount) BankAccount : +withdrawal(amount) classDiagram class BankAccount BankAccount : +String owner BankAccount : +Bigdecimal balance BankAccount : +deposit(amount) BankAccount : +withdrawal(amount) Define a class class label classDiagram class Animal["Animal with a label"] class Car["Car with *! symbols"] Animal --> Car classDiagram class Animal["Animal with a label"] class Car["Car with *! symbols"] Animal --> Car Define members of a class classDiagram class BankAccount{ +String owner +BigDecimal balance +deposit(amount) +withdrawal(amount) } classDiagram class BankAccount{ +String owner +BigDecimal balance +deposit(amount) bool +withdrawal(amount) int } 区别 attributes 和 methods 的方法是,带()的是 methods。...
Syntax ->> 同步消息,-)异步消息。 sequenceDiagram Alice->>John: Hello John, how are you? John-->>Alice: Great! Alice-)John: See you later! sequenceDiagram Alice->>John: Hello John, how are you? John-->>Alice: Great! Alice-)John: See you later! Participants sequenceDiagram participant Alice participant Bob Bob->>Alice: Hi Alice Alice->>Bob: Hi Bob sequenceDiagram participant Alice participant Bob Bob->>Alice: Hi Alice Alice->>Bob: Hi Bob Actors actor 会有一个人物的标志。 sequenceDiagram actor Alice actor Bob Alice->>Bob: Hi Bob Bob->>Alice: Hi Alice sequenceDiagram actor Alice actor Bob Alice->>Bob: Hi Bob Bob->>Alice: Hi Alice Aliases sequenceDiagram participant A as Alice participant J as John A->>J: Hello John, how are you?...
Lab >>> print('Go') Go HW Q1 A Plus Abs B python3 ok -q a_plus_abs_b --local def a_plus_abs_b(a, b): if b < 0: f = sub else: f = add return f(a, b) Q2 Two of Three python3 ok -q two_of_three --local 返回三个数中最小的两个数。先取 min(i, j)得到较小的一个数,在从 min(max(i, j), k)中得到第二小的数。 def two_of_three(i, j, k): return min(i, j)**2 + min(max(i, j), k)**2 Q3 Largest Factor python3 ok -q largest_factor --local 返回能被整除的最大数。从 1 到 n 遍历,如果 n%i==0 即能够整除,返回最大值。...