Camera RK平台攝像頭驅動

2021-10-02 20:08:42 字數 4533 閱讀 9880

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...