platform:rk3399
os:android 7.1
kernel:4.4
參考:1. krisfei
rk平台抽象出了乙個公共的camera驅動,給應用層提供通用的camera驅動註冊和操作介面。這樣將camera驅動和配置全部抽離到使用者空間,不需要重新編譯和除錯核心,極大的簡化了camera的移植和除錯。
除usb攝像頭走v4l2之外,其餘型別的攝像頭均走rk自己定義的一套公共camera驅動介面。
//isp裝置描述結構體
typedef struct camsys_dev_s camsys_dev_t;
//記憶體資訊描述結構體
typedef struct camsys_meminfo_s camsys_meminfo_t;
//phy資訊描述結構體
typedef struct camsys_phyinfo_s camsys_phyinfo_t;
//中斷連線描述結構體
typedef struct camsys_irqcnnt_s camsys_irqcnnt_t;
ioctl codes
說明camsys_verchk
檢查驅動版本和標頭檔案版本
camsys_i2crd
讀i2c暫存器
camsys_i2cwr
寫i2c暫存器
camsys_sysctrl
sysctl控制(vdd,gpio,clk,phyflash,iommu)
camsys_regrd
空camsys_regwr
空camsys_register_devio
註冊camera
camsys_deregister_devio
登出camera
camsys_irqconnect
中斷連線
camsys_irqwait
中斷等待
camsys_irqdisconnect
中斷斷開
camsys_qureymem
查詢i2c或暫存器對映
camsys_qureyiommu
查詢是否是能iommu
camsys_platform_probe(struct platform_device *pdev) //isp probe
-->camsys_soc_init(chip_type); //根據chip_type 選擇對應的配置函式
-->camsys_soc_p->soc_cfg = camsys_rk3399_cfg;
--->irq_id = irq_of_parse_and_map(dev->of_node, 0); //對映中斷
----> init_list_head(&camsys_dev->extdevs.list); //初始化camera 鍊錶(支援兩個camera)
----> init_list_head(&camsys_dev->extdevs.active); //初始化開啟裝置鍊錶
----> init_list_head(&camsys_dev->list); //初始化isp鍊錶(支援兩個isp)
//註冊mipiphy驅動
if (camsys_mipiphy_probe_cb(pdev, camsys_dev) < 0)
//註冊camsys_marvin驅動
camsys_mrv_probe_cb(pdev, camsys_dev);
//初始化ext flash鍊錶
camsys_init_ext_fsh_module();
主要填充camsys_phyinfo_s結構體
//獲取mipiphy數量
err = of_property_read_u32(dev->of_node,"rockchip,isp,mipiphy", &mipiphy_cnt);
//初始化meminfo
camsys_dev->mipiphy[i].reg = meminfo;
//初始化clk
camsys_dev->mipiphy[i].clk = (void *)phyclk;
//初始化成員函式
camsys_dev->mipiphy[i].phycnt = mipiphy_cnt;
camsys_dev->mipiphy[i].clkin_cb = camsys_mipiphy_clkin_cb;
camsys_dev->mipiphy[i].ops = camsys_mipiphy_ops;
camsys_dev->mipiphy[i].remove = camsys_mipiphy_remove_cb;
//獲取cru基址
camsys_dev->rk_cru_base = (unsigned long)of_iomap(node, 0);
//獲取grf基址
camsys_dev->rk_grf_base = (unsigned long)of_iomap(node, 0);
struct file_operations camsys_fops =
;
camsys_mrv_probe_cb
-->err =
request_irq
(camsys_dev->irq.irq_id, camsys_mrv_irq,
//申請中斷
irqf_shared, camsys_marvin_irqname,
camsys_dev);--
->
pm_runtime_enable
(&pdev->dev)
;//使能pm
--->
clk_set_rate
(mrv_clk->isp,
210000000);
//初始化clk
clk_set_rate
(mrv_clk->isp_jpe,
210000000);
----
>domain =
iommu_domain_alloc
(&platform_bus_type)
;//根據bus type配domain
----
-> err =
iommu_get_dma_cookie
(domain)
;//根據domain獲取dma-api資源
--->group =
iommu_group_alloc()
;//分配乙個group
----
>err =
iommu_group_add_device
(group,
&pdev->dev)
;//將dev新增到iommu group
----
> camsys_dev->iommu_cb = camsys_mrv_drm_iommu_cb;
// dma_buf map
----
-> err =
misc_register
(&camsys_dev->miscdev)
;//註冊雜項裝置camsys_marvin1
----
>camsys_dev->dev_id = camsys_devid_marvin;
//初始化dev_id
camsys_dev->platform_remove = camsys_mrv_remove_cb;
//初始化probe_remove函式
重要結構體
struct rt8547_platform_data
;typedef
struct ext_fsh_info_***t_fsh_info_t;
註冊flash dev(rt8547)
camsys_register_ext_fsh_dev //camsys_register_devio 中註冊
--->
platform_device_register
(&new_dev->pdev)
//註冊rt8547平台驅動
----
>
list_add_tail
(&new_dev->list,
&g_ext_fsh_devs.dev_list)
;//將flash裝置新增到鍊錶
flash ctrl
mode:
0: cam_engine_flash_off = 0x00,
1: cam_engine_flash_auto = 0x01,
2: cam_engine_flash_on = 0x02,
3: cam_engine_flash_red_eye = 0x03,
5: cam_engine_flash_torch = 0x05
個人部落格:www.letcos.top DirectShow驅動攝像頭
對於小攝像頭的驅動有幾種方法,通過使用directshow來驅動攝像頭靈活性比較好,有簡單的方法也有比較複雜但更有效的方法,本文只介紹簡單方法,希望與大家交流!用directshow來使用攝像頭,一般要求攝像頭的驅動是wdm格式的,當然,一些比較老的驅動格式directshow也可支援。direct...
第1 5節 攝像頭驅動 USB攝像頭驅動框架
1.寫乙個usb攝像頭驅動程式 當我們把usb裝置接到電腦或板子上去時,如果這個裝置能夠被usb driver所支援 id table吻合 probe函式就會被呼叫,在probe函式裡面就可以做我們想做的事了 對於攝像頭驅動程式來說,是1.分配乙個video device結構體 2.設定這個結構體 ...
使用DirectShow驅動攝像頭
對於小攝像頭的驅動有幾種方法,通過使用directshow來驅動攝像頭靈活性比較好,有簡單的方法也有比較複雜但更有效的方法,本文只介紹簡單方法,希望與大家交流!用directshow來使用攝像頭,一般要求攝像頭的驅動是wdm格式的,當然,一些比較老的驅動格式directshow也可支援。direct...