目前日期文章:201602 (7)

瀏覽方式: 標題列表 簡短摘要

MIPI技術與版本因為時代進步一值更新,在實體層除了M-PHY,D-PHY之外,又多出個 C-PHY
下圖可以看出 C-PHY 的位置



C-PHY的訊號線由3 條 trio成一組,總共可以有三組,也就是 9 條 trios

粗略規格列在以下提供給各位參考,我個人覺得C-PHY 是 D-PHY的改進版,除了速度更快之外,更是重新使用了 D-PHY的 LP mode
----
C-PHY
  • 3-wire(trio A,B,C) signal represents a lane.
  • New encoder scheme to increase the number of bits per symbol(~2.5bit/symbol)
  • Projected rate at 2.5GSym/s(effective data rate of 5.7Gbps)
  • Signal is transmitted single-ended but received using differential receivers.
  • Reuse LP mode defined in D-PHY.
(Note: D-PHY 2.0 data rate 3.5Gbps)
-----
文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

20160212-土牧譯健康農莊(下)紅豆湯吃不完啦!

因為這次露營取材較多,所以分成 上、中、下 三部曲來寫,希望客官能看得盡興
時間來到露營第二天早上,一早起來看到好天氣,心中就鬆了一口氣,應該可以收乾帳
昨晚的露水超重的,整個帳外與天幕都是露水


我們在E區搭設帳棚的方向為坐東朝西,後方有一個山頭,太陽預計在十點左右才會慢慢照到E區


上面照片是在早上七點多拍的,太陽從後面山頭慢慢上來,照到西方的山頭上


小朋友也陸陸續續起床了


都沒有忘記刷牙,很棒


Crazy Family早餐店開始製作早餐了,陣陣香味,大家聞了肚子都餓了


吃完早餐,小朋友的電力又恢復成100%

那我們就再來玩個趣味競賽吧


這麻布可是脩爸特別準備的,竟然有準備我們就要好好的來玩一下 [袋鼠跳]


[夾氣球],看誰比較快

小朋友運動完後,接著開始進行曬睡袋、曬裝備,這次收帳篷所有人都一起幫忙,沒有人拍照所以比較少照片


在吃中餐前,大伙集合一起拍個合照作紀念

花絮:

姊夫終於成功拍到煙火


這次有記得帶自製的法蘭絨床包


煜翔哥哥連露營都不忘架SERVER


茹茹姑姑悠閒的喝下午茶


還是沒有當主廚的 脩媽,舒服的坐著新椅子


詩為姐姐不知道帶來的書有沒有看完??


讓我們期待下次的出遊吧!




對了,最後這鍋小甜點-紅豆湯到底有沒有喝完啊???






文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

20160212-土牧譯健康農莊(中)突發狀況


[土牧譯健康農莊]官方網站如下,預定營地是採用[愛露營]APP
http://www.tumuyi.com.tw/
因這次來的時間屬於春節連續假期,所以每位營位價錢為1200元
土牧譯分為土牧驛營區、麗德營區、瑪雅營區(目前尚未營運)"預計8月中開放",每區採取階梯型配置
[土牧譯健康農莊]距離汶水老街差不多半小時車程,會有一段山路,有些路段不好會車,最好小心駕駛

抵達營區後,老婆的同學梅菁、聰智與兩個大哥哥早就抵達,並搭好帳篷
而我們這一團的大人就開始下裝備並忙著搭帳篷
以往這個時候的照片是最少的,因為所有人都忙於搭帳棚,沒有人負責拍照
不過這次因為有大哥哥、大姊姊,重要的拍照工作就先暫時交給他們了

我們先邀請梅菁、聰智的兩位大哥哥一起來參加遊戲


因為之前有在家演練過,子皜哥哥當主持人,開始帶領 小朋友跟大哥哥,玩起[小朋友版本玩很大]


遊戲項目有[一擲千金]


[千軍萬馬]


[比手畫腳]


基本上是分為兩隊競賽,但小朋友們似乎不怎麼好控制....好幾次聽到子皜哥哥快要抓狂的叫聲


每獲勝一個項目就可以得到[星球]一顆


最後採用[命運好好玩]方式決勝負


賽後通通有獎,發禮物了(忘了大哥哥們的份,真不好意思)

畫面轉到搭帳棚這邊,少了小朋友的幫忙,大人就可以好好按部就班的搭帳棚


脩脩窩十人帳搭設完成


Crazy Family也搭設完成


梅菁聰智家很早就搭好了


馴龍窩也搭設完畢


開始製作門牌拍照留念,Crazy Family第三露





脩脩窩是第四露摟


馴龍窩也是第四露


搭好帳篷也快要四點多了,趁太陽還沒下山,逛一下整個營地


這一棟是民宿,每一房價格在3500元以上


土牧譯彩繪石頭


麗德營區的浴廁比較多間,也比較乾淨,建議土牧譯營區的可以來這邊洗澡

五點半左右,太陽公公就下班,開始準備晚餐


這次脩脩窩由朝宏掌廚,感謝聰智幫忙照明


Crazy Family由老姊掌廚


馴龍窩由..............恩..........脩爸掌廚??.........這...................我老婆變 成 脩爸???
馴龍窩這次準備的是咖哩麵,比較方便簡單;就把卡爐借給脩爸煮小甜點-紅豆湯(怎麼這麼大鍋啊???)


六點半開始將桌子移到中間,開始用餐


營區旁有人放煙火,大家邊吃晚餐邊看煙火


小朋友在脩脩窩的客廳帳吃


吃完晚餐後,登場的是[燈籠趴],大家拿著自己準備的燈籠,一起去夜遊


回到營區後,稍作休息,拍拍夜照




看看星空


十點半左右,互道晚安,全面熄燈就寢

大概晚上十一點左右,因老姊手機關機,姊夫接到家裡電話,告知家裡的母親因地板濕滑,跌倒摔斷手
全部的人都起來關心,並打電話回去詢問狀況

感謝家中大哥的立即處理,將母親送到醫院,在凌晨兩點多開刀,於隔天早上六點安排住院
真是辛苦他了
(隔天結束露營後,一行人馬上去醫院關心母親,並協助處理後續安全工作,安裝止滑條等)

這一晚,睡不太著..


....請接(下集)



 
文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

20160212-土牧譯健康農莊(上)之露營人數突破20人


隨著露營次數的增加,整個露營規劃也越來越上手,開始出現標準作業流程(SOP)
其SOP如下:
----
1.找營地並詢問所有團隊成員日期是否恰當?
2.出發前一週開始觀察天氣,如果預定露營當天會下雨,將會取消或延期
3.出發前兩天,召開會議討論露營相關事宜,包括三餐食材、集合時間、開車路線、行程規劃等
4.露營後一週,結算費用,開始規畫下一次露營
----
以上的流程目前跑起來還蠻順的,露營要玩得盡興,事前規劃一定不能少。

好,進入主題,這一次我們要到位於苗栗泰安的[土牧譯健康農莊]露營
區位為E區,帳數四帳,人數20人(歡迎新成員加入,相信你們一定會喜歡露營的)
因為營區規定連續假日的搭營時間為下午1400之後,所以我們先到附近的[洗水坑豆腐街]逛一逛吃吃中餐
我是第一次來到[洗水坑豆腐街],但是姊夫、堂妹以前都有來過了,對一些有名的店比較清楚,所以我們就跟著走就對了


一行人先在路口處拍個團體照,這次出動四台車
(老婆的朋友梅菁、聰智跟兩個大哥哥(),會從北部直接到營地集合)


本來是要在[清安豆腐店]吃中餐,但是老闆說十一點後才有提供豆腐類的餐點,十一點前只供麵食類的


所以我們一行人就改到[老街牛肉麵館]吃中餐,因時間不到十一點,二樓用餐區都沒人
點餐後上菜速度很快,且用起餐來非常愉快
來到這種超夯景點,千萬不要跟自己過不去,請儘量避開尖峰用餐時間,玩起來才愉快


上菜前拍照留念。
人與人之間的情感,都是由共同經歷的旅程所組成(我超文青的)。


小朋友更要拍多一點照片,長大之後才有梗可以聊 ( 請見[長頸鹿交配]梗 )


看照片就知道餐點有多好吃,吃完都流汗了


吃完中餐後,繼續前往豆花店吃豆花


吃豆花之餘,閒聊一下大家的近況,順便鼓吹新成員加入固定班底


並聊一下營地的狀況與食材是否充足,如果不夠在老街可以買一些上去營地


茹茹姑姑變成小朋友桌的桌主,完全沒有違和感(^_^)
在朝宏叔叔大完便後,我們一行人就離開了[洗水坑豆腐街],前往下一個景點[騰龍山莊]


用自拍棒拍大合照還真方便,不用帶笨重的腳架,所有人也都可以入鏡


大人忙著看風景拍照






山莊內的櫻花都開了,很漂亮


小朋友在小水溝玩起水


出門玩,多了小朋友的笑聲感覺很不一樣,大人的心裡是開心的、有活力的


孩子們之間的互動,將會奠定之後他們之間的情感,共同出遊就會有共同回憶

[騰龍山莊]內還有一座吊橋,很大很穩固,大家就開始玩起跳躍拍照看誰比較高的遊戲

 

(跳不停跳不停跳不停!!!)

眼看時間已經接近下午1330了,可以出發前往營地了
 
請按畫面最右邊箭頭,前往[ 20160212-土牧譯健康農莊(中)突發狀況 ]








 
文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(1) 人氣()

Media Controller API淺嚐

最近有機會研究了一下Media Controller API在這邊做一下紀錄
Media Controller API主要是針對 /dev/mediaX device file 做存取

官方Medial Controller API文件的說明為:
https://www.linuxtv.org/downloads/v4l-dvb-apis/media_common.html

根據我對其在簡介部分解讀精簡如下
Media Controller API主要是要解決以下問題
1.近年來越來越多多媒體裝置都會有多重的功能,這些功能以前只能從 sysfs得知其關係
2.查出裝置內的拓樸關係,並可在運作期間組態它

以下只先針對三大部分來做實作,其餘留有興趣的人去研究
.media open()
.media close()
.media ioctl()
    -ioctl MEDIA_IOC_DEVICE_INFO — Query device information
    -ioctl MEDIA_IOC_ENUM_ENTITIES — Enumerate entities and their properties
    
我的裝置為msm8992,Android 6.0,開完機後用adb shell去看系統檔案,發現在/dev下有三個media裝置,分別為
/dev/media0
/dev/media1
/dev/media2

所以我們可以,建立兩個檔案 mediatest.c 與 Android.mk,這邊我是放在AOSP內 device\qcom\msm8992\mediatest\ 目錄下
build的方式,你必須已經有 make -j6過一次image,將目錄切換到 device\qcom\msm8992\mediatest\下,鍵入 mm 指令,就可以build
如果成功 build出的,檔案會產生在 out\target\product\msm8992\system\bin\mediatest

.media open()
 要開啟 /dev/mediaX,要 #include <fcntl.h>,呼叫 open函式,成功的話會得到傳回的 file descriptor
 函式原型為:
 int open(    const char *device_name,int flags);
 
.media close()
 要關閉 /dev/mediaX,要 #include <unistd.h>,呼叫 close 函式,成功的話會得到傳回 0
 函式原型為:
 int close(    int fd);
 
.media ioctl() - ioctl MEDIA_IOC_DEVICE_INFO — Query device information
 利用ioctl MEDIA_IOC_DEVICE_INFO 來得知裝置的資訊,第三個參數為struct media_device_info *argp 指標
 執行成功,會將資料填入 struct media_device_info *argp 指標內
 函式原型為:
 int ioctl(    int fd,    int request,    struct media_device_info *argp);
 media_device 結構如下: (include/media/media-device.h)
 ---
 struct media_device {
    /* dev->driver_data points to this struct. */
    struct device *dev;
    struct media_devnode devnode;

    char model[32];
    char serial[40];
    char bus_info[32];
    u32 hw_revision;
    u32 driver_version;

    u32 entity_id;
    struct list_head entities;

    /* Protects the entities list */
    spinlock_t lock;
    /* Serializes graph operations. */
    struct mutex graph_mutex;

    int (*link_notify)(struct media_pad *source,
               struct media_pad *sink, u32 flags);
  };
  --
 
 mediatest運行後,針對/dev/media0 下MEDIA_IOC_DEVICE_INFO ioctl command得到以下media_device_info資訊
 --------------------------
 mdev_info.driver=msm,
 mdev_info.model=msm_config,
 mdev_info.serial=,
 mdev_info.bus_info=,
 mdev_info.media_version=256,
 mdev_info.hw_revision=0,
 mdev_info.driver_version=0,
 --------------------------
 在kernel driver,這部分的code是位於 AOSP /driver/media/platform/msm/camera_v2/msm.c 中 msm_probe function
 可以看到以下的 code
 --
 #if defined(CONFIG_MEDIA_CONTROLLER)
   ...
     strlcpy(msm_v4l2_dev->mdev->model, MSM_CONFIGURATION_NAME,
            sizeof(msm_v4l2_dev->mdev->model));
    msm_v4l2_dev->mdev->dev = &(pdev->dev);

    rc = media_device_register(msm_v4l2_dev->mdev);            
  --
  其中 /dev/mediaX是呼叫 media_device_register 去註冊的
  呼叫 media_device_unregister(msm_v4l2_dev->mdev); 去 unregister
 
 
.media ioctl() -ioctl MEDIA_IOC_ENUM_ENTITIES — Enumerate entities and their properties
 利用ioctl MEDIA_IOC_ENUM_ENTITIES 來列舉實體裝置與性能,第三個參數為struct media_entity_desc *argp 指標
 執行成功,會將資料填入 struct media_entity_desc *argp 指標內
 函式原型為:
 int ioctl(    int fd,    int request,    struct media_entity_desc *argp);  
 media_entity 結構如下: (include/media/media-entity.h)
 --
 struct media_entity {
    struct list_head list;
    struct media_device *parent;    /* Media device this entity belongs to*/
    u32 id;                /* Entity ID, unique in the parent media
                     * device context */
    const char *name;        /* Entity name */
    u32 type;            /* Entity type (MEDIA_ENT_T_*) */
    u32 revision;            /* Entity revision, driver specific */
    unsigned long flags;        /* Entity flags (MEDIA_ENT_FL_*) */
    u32 group_id;            /* Entity group ID */

    u16 num_pads;            /* Number of sink and source pads */
    u16 num_links;            /* Number of existing links, both
                     * enabled and disabled */
    u16 num_backlinks;        /* Number of backlinks */
    u16 max_links;            /* Maximum number of links */

    struct media_pad *pads;        /* Pads array (num_pads elements) */
    struct media_link *links;    /* Links array (max_links elements)*/

    const struct media_entity_operations *ops;    /* Entity operations */

    /* Reference counts must never be negative, but are signed integers on
     * purpose: a simple WARN_ON(<0) check can be used to detect reference
     * count bugs that would make them negative.
     */
    int stream_count;        /* Stream count for the entity. */
    int use_count;            /* Use count for the entity. */

    struct media_pipeline *pipe;    /* Pipeline this entity belongs to. */

    union {
        /* Node specifications */
        struct {
            u32 major;
            u32 minor;
        } v4l;
        struct {
            u32 major;
            u32 minor;
        } fb;
        struct {
            u32 card;
            u32 device;
            u32 subdevice;
        } alsa;
        int dvb;

        /* Sub-device specifications */
        /* Nothing needed yet */
    } info;
  };
  --
  mediatest運行後,針對/dev/media0 下 MEDIA_IOC_ENUM_ENTITIES ioctl command得到以下 media_entity 資訊
  總共得到了19個 media_entity
  --------------------------
  main 97,ioctl success,id=1,name=video0
  --------------------------
  entity.id=1,
  entity.name=video0,
  entity.type=65537,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=2,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=2,name=msm_cci
  --------------------------
  entity.id=2,
  entity.name=msm_cci,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=0,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=3,name=v4l-subdev0
  --------------------------
  entity.id=3,
  entity.name=v4l-subdev0,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=0,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=4,name=v4l-subdev1
  --------------------------
  entity.id=4,
  entity.name=v4l-subdev1,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=0,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=5,name=v4l-subdev2
  --------------------------
  entity.id=5,
  entity.name=v4l-subdev2,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=0,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=6,name=v4l-subdev3
  --------------------------
  entity.id=6,
  entity.name=v4l-subdev3,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=1,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=7,name=v4l-subdev4
  --------------------------
  entity.id=7,
  entity.name=v4l-subdev4,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=1,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=8,name=v4l-subdev5
  --------------------------
  entity.id=8,
  entity.name=v4l-subdev5,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=1,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=9,name=v4l-subdev6
  --------------------------
  entity.id=9,
  entity.name=v4l-subdev6,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=1,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=10,name=v4l-subdev7
  --------------------------
  entity.id=10,
  entity.name=v4l-subdev7,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=7,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=11,name=v4l-subdev8
  --------------------------
  entity.id=11,
  entity.name=v4l-subdev8,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=16,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=12,name=v4l-subdev9
  --------------------------
  entity.id=12,
  entity.name=v4l-subdev9,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=14,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=13,name=v4l-subdev10
  --------------------------
  entity.id=13,
  entity.name=v4l-subdev10,
  entity.type=131072,
  entity.revision=10,
  entity.flags=0,
  entity.group_id=9,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=14,name=v4l-subdev11
  --------------------------
  entity.id=14,
  entity.name=v4l-subdev11,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=3,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=15,name=v4l-subdev12
  --------------------------
  entity.id=15,
  entity.name=v4l-subdev12,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=3,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=16,name=v4l-subdev13
  --------------------------
  entity.id=16,
  entity.name=v4l-subdev13,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=2,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=17,name=v4l-subdev14
  --------------------------
  entity.id=17,
  entity.name=v4l-subdev14,
  entity.type=131072,
  entity.revision=0,
  entity.flags=0,
  entity.group_id=13,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 97,ioctl success,id=18,name=v4l-subdev15
  --------------------------
  entity.id=18,
  entity.name=v4l-subdev15,
  entity.type=131072,
  entity.revision=0,
  entity.flags=769,
  entity.group_id=6,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 103,id=18,name=v4l-subdev15
  main 112,open /dev/v4l-subdev15 success
  main 122,ioctl success
  main 124,ioctl success,sensor_name=ov8865
  main 127, sensor_info.subdev_id[0] = 1
  main 127, sensor_info.subdev_id[1] = -1
  main 127, sensor_info.subdev_id[2] = 0
  main 127, sensor_info.subdev_id[3] = -1
  main 127, sensor_info.subdev_id[4] = 0
  main 127, sensor_info.subdev_id[5] = -1
  main 127, sensor_info.subdev_id[6] = 0
  main 127, sensor_info.subdev_id[7] = -1
  main 127, sensor_info.subdev_id[8] = 0
  main 127, sensor_info.subdev_id[9] = -1
  main 127, sensor_info.subdev_id[10] = -1
  main 97,ioctl success,id=19,name=v4l-subdev16
  --------------------------
  entity.id=19,
  entity.name=v4l-subdev16,
  entity.type=131072,
  entity.revision=0,
  entity.flags=65793,
  entity.group_id=6,
  entity.pads=0,
  entity,links=0,
  --------------------------
  main 103,id=19,name=v4l-subdev16
  main 112,open /dev/v4l-subdev16 success
  main 122,ioctl success
  main 124,ioctl success,sensor_name=de2011
  main 127, sensor_info.subdev_id[0] = 2
  main 127, sensor_info.subdev_id[1] = -1
  main 127, sensor_info.subdev_id[2] = -1
  main 127, sensor_info.subdev_id[3] = -1
  main 127, sensor_info.subdev_id[4] = -1
  main 127, sensor_info.subdev_id[5] = -1
  main 127, sensor_info.subdev_id[6] = 2
  main 127, sensor_info.subdev_id[7] = -1
  main 127, sensor_info.subdev_id[8] = 2
  main 127, sensor_info.subdev_id[9] = -1
  main 127, sensor_info.subdev_id[10] = -1
  main 93, ioctl failed  
 ---
 針對第1個entity
 --------------------------
 entity.id=1,
 entity.name=video0,
 entity.type=65537,
 entity.revision=0,
 entity.flags=0,
 entity.group_id=2,
 entity.pads=0,
 entity,links=0,
 --------------------------
 code 落在 /driver/media/platform/msm/camera_v2/msm.c
 中 msm_probe 函式
#if defined(CONFIG_MEDIA_CONTROLLER)
  ..
    pvdev->vdev->entity.type = MEDIA_ENT_T_DEVNODE_V4L;  //65537
    pvdev->vdev->entity.group_id = QCAMERA_VNODE_GROUP_ID;  // 2
#endif
 
  針對第 18,19 個 entity
 --------------------------
 entity.id=18,
 entity.name=v4l-subdev15,
 entity.type=131072,
 entity.revision=0,
 entity.flags=769,
 entity.group_id=6,
 entity.pads=0,
 entity,links=0,
 --------------------------
 entity.id=19,
 entity.name=v4l-subdev16,
 entity.type=131072,
 entity.revision=0,
 entity.flags=65793,
 entity.group_id=6,
 entity.pads=0,
 entity,links=0,
 --------------------------
 kernel code 落在 /driver/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c
 中 msm_sensor_driver_create_v4l_subdev 函式
 entity.type 的值為 MEDIA_ENT_T_V4L2_SUBDEV (131072)
 entity.group_id 的值為 MSM_CAMERA_SUBDEV_SENSOR (6)
 
 mediatest程式會判斷當 (entity.type == MEDIA_ENT_T_V4L2_SUBDEV(131072) && entity.group_id == MSM_CAMERA_SUBDEV_SENSOR(6))
 去開啟 /dev/entity.name ,並下達
 cfg.cfgtype = CFG_GET_SENSOR_INFO;
 ioctl(sd_fd, VIDIOC_MSM_SENSOR_CFG, &cfg);
 去得到 sensor information 結構 struct sensorb_cfg_data cfg;
 

 kernel code 落在 /driver/media/platform/msm/camera_v2/sensor/msm_sensor.c  msm_sensor_config32 函式
 ---
    case CFG_GET_SENSOR_INFO:
        memcpy(cdata->cfg.sensor_info.sensor_name,
            s_ctrl->sensordata->sensor_name,
            sizeof(cdata->cfg.sensor_info.sensor_name));
        cdata->cfg.sensor_info.session_id =
            s_ctrl->sensordata->sensor_info->session_id;
        for (i = 0; i < SUB_MODULE_MAX; i++) {
            cdata->cfg.sensor_info.subdev_id[i] =
                s_ctrl->sensordata->sensor_info->subdev_id[i];
            cdata->cfg.sensor_info.subdev_intf[i] =
                s_ctrl->sensordata->sensor_info->subdev_intf[i];
        }
        cdata->cfg.sensor_info.is_mount_angle_valid =
            s_ctrl->sensordata->sensor_info->is_mount_angle_valid;
        cdata->cfg.sensor_info.sensor_mount_angle =
            s_ctrl->sensordata->sensor_info->sensor_mount_angle;
        cdata->cfg.sensor_info.position =
            s_ctrl->sensordata->sensor_info->position;
        cdata->cfg.sensor_info.modes_supported =
            s_ctrl->sensordata->sensor_info->modes_supported;
        CDBG("%s:%d sensor name %s\n", __func__, __LINE__,
            cdata->cfg.sensor_info.sensor_name);
        CDBG("%s:%d session id %d\n", __func__, __LINE__,
            cdata->cfg.sensor_info.session_id);
        for (i = 0; i < SUB_MODULE_MAX; i++) {
            CDBG("%s:%d subdev_id[%d] %d\n", __func__, __LINE__, i,
                cdata->cfg.sensor_info.subdev_id[i]);
            CDBG("%s:%d subdev_intf[%d] %d\n", __func__, __LINE__,
                i, cdata->cfg.sensor_info.subdev_intf[i]);
        }
        CDBG("%s:%d mount angle valid %d value %d\n", __func__,
            __LINE__, cdata->cfg.sensor_info.is_mount_angle_valid,
            cdata->cfg.sensor_info.sensor_mount_angle);

        break;
  ---

 有了以上的實作,相信各位應該可以更清楚瞭解到 media controller API與 kernel dirver的對應關係了
 希望對各位有所幫助。
 
 最後附上 mediatest.c 與 Android.mk 完整 source code 給各位參考
 Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng
LOCAL_SRC_FILES:=mediatest.c
LOCAL_MODULE:=mediatest
LOCAL_CPPFLAGS += -DANDROID
LOCAL_SHARED_LIBRARIES:=libc
$(info "=========================================>>>>>>>>$(LOCAL_PATH)/$(KERNEL_DIR)")

LOCAL_C_INCLUDES+= $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include/media
LOCAL_C_INCLUDES+= $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
LOCAL_C_INCLUDES+= hardware/qcom/camera/QCamera2/stack/common
LOCAL_C_INCLUDES += \
           $(LOCAL_PATH) \
           $(LOCAL_PATH)/$(KERNEL_DIR)/include \
           
include $(BUILD_EXECUTABLE)
 mediatest.c
#include <fcntl.h>  // for open
#include <unistd.h>  // for close
#include <stdio.h>
#include <sys/ioctl.h> 
#include <linux/media.h>
#include <media/msm_cam_sensor.h>
#include <media/msmb_camera.h>
#include <string.h>  // for memset

struct media_device_info mdev_info;
struct media_entity_desc entity;
struct sensorb_cfg_data cfg;

int32_t num_media_devices = 0;

  
  
void showm_entity()
{
        printf("--------------------------\n"); 
        printf("entity.id=%d,\n",entity.id);   
        printf("entity.name=%s,\n",entity.name);   
        printf("entity.type=%d,\n",entity.type);   //MEDIA_ENT_T_V4L2_SUBDEV
        printf("entity.revision=%d,\n",entity.revision);   
        printf("entity.flags=%d,\n",entity.flags);   
        printf("entity.group_id=%d,\n",entity.group_id);   //MSM_CAMERA_SUBDEV_SENSOR
        printf("entity.pads=%d,\n",entity.pads);   
        printf("entity,links=%d,\n",entity.links);   
  printf("--------------------------\n"); 

  return ;      
}

  
void showm_mdev_info()
{
        printf("--------------------------\n");   
        printf("mdev_info.driver=%s,\n",mdev_info.driver);   
        printf("mdev_info.model=%s,\n",mdev_info.model);   
        printf("mdev_info.serial=%s,\n",mdev_info.serial);   
        printf("mdev_info.bus_info=%s,\n",mdev_info.bus_info); 
        printf("mdev_info.media_version=%d,\n",mdev_info.media_version);   
        printf("mdev_info.hw_revision=%d,\n",mdev_info.hw_revision);            
        printf("mdev_info.driver_version=%d,\n",mdev_info.driver_version);   
        printf("--------------------------\n");   
        return;
}  
  
int main()
{

  int dev_fd=0;
  int sd_fd=0;
  int rc=-1;
  char dev_name[32];
  char subdev_name[32];
  int i;
  int32_t num_media_devices = 0;  //media file count 
  
  printf("%s+ %d,\n",__func__,__LINE__);
  
  
  while (1) {
          int num_entities = 1;   
          snprintf(dev_name, sizeof(dev_name), "/dev/media%d", num_media_devices);
          //dev_fd=open("/dev/media0", O_RDWR );
          dev_fd=open(dev_name, O_RDWR);
          if(dev_fd<0){
                printf("%s %d, open %s failed\n",__func__,__LINE__,dev_name);   
                return rc;
          }else{
                printf("%s %d,open %s success\n",__func__,__LINE__,dev_name);   
          }
          
          num_media_devices++;
          
          memset(&mdev_info, 0, sizeof(mdev_info));
          rc=ioctl(dev_fd,MEDIA_IOC_DEVICE_INFO,&mdev_info);  
          if(rc < 0){
                printf("%s %d, ioctl failed\n",__func__,__LINE__);   
                goto close_media;
          }else{
                printf("%s %d,ioctl success,model=%s\n",__func__,__LINE__,mdev_info.model);  
                showm_mdev_info();
          }  
          
          while (1) {
          //ioctl MEDIA_IOC_ENUM_ENTITIES
                  memset(&entity, 0, sizeof(entity));
                  entity.id=num_entities++;  //??
                  rc=ioctl(dev_fd,MEDIA_IOC_ENUM_ENTITIES,&entity);  
                  if(rc < 0){
                        printf("%s %d, ioctl failed\n",__func__,__LINE__);   
                        //goto close_media;
                        break;
                  }else{
                        printf("%s %d,ioctl success,id=%d,name=%s\n",__func__,__LINE__,entity.id,entity.name);  
                        showm_entity();
                  }    
                  
                  //MEDIA_ENT_T_V4L2_SUBDEV= 131072 ,MSM_CAMERA_SUBDEV_SENSOR =6
            if (entity.type == MEDIA_ENT_T_V4L2_SUBDEV && entity.group_id == MSM_CAMERA_SUBDEV_SENSOR) {
                printf("%s %d,id=%d,name=%s\n",__func__,__LINE__,entity.id,entity.name); 
                snprintf(subdev_name, sizeof(subdev_name), "/dev/%s", entity.name);
                
                sd_fd=open(subdev_name, O_RDWR);
                                  if(sd_fd<0){
                                        printf("%s %d, open %s failed\n",__func__,__LINE__,subdev_name);   
                                        //goto close_media;
                                        continue;
                                  }else{
                                        printf("%s %d,open %s success\n",__func__,__LINE__,subdev_name);   
                                  }        
                memset(&cfg, 0, sizeof(cfg));
                cfg.cfgtype = CFG_GET_SENSOR_INFO;
                rc=ioctl(sd_fd, VIDIOC_MSM_SENSOR_CFG, &cfg);
                                  if(rc < 0){
                                        printf("%s %d, ioctl failed\n",__func__,__LINE__);   
                                        close(sd_fd);  
                                        continue;
                                  }else{
                                        printf("%s %d,ioctl success\n",__func__,__LINE__);                              
                                  }       
                                        printf("%s %d,ioctl success,sensor_name=%s\n",__func__,__LINE__,cfg.cfg.sensor_info.sensor_name);                               
                                     
                for (i = 0; i < SUB_MODULE_MAX; i++) {
                  printf("%s %d, sensor_info.subdev_id[%d] = %d\n",__func__,__LINE__, i, cfg.cfg.sensor_info.subdev_id[i]);
                }                         
                
            }
                  
          }
  }
  printf("%s %d,\n",__func__,__LINE__);    

close_sd: 
        close(sd_fd);  
        
close_media:    
  
  close(dev_fd);
  printf("%s %d, close \n",__func__,__LINE__);
        return rc;
}
 
 
 
 

文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

20160130-第3露橫山仙境(南投)-下篇(露營還是多人熱鬧、晴天收帳)

時間到了第一天下午四點鐘,[Crazy Family]抵達營地來探班



連煜翔大哥哥也一起來了


一群人開始閒話家常,順便討論一下此次單飛的心得,與天幕的搭設技巧


當然也不能忘記拍一些照片,Line 給[露營組]中無法前來的成員羨慕一下!
(老公............老公.............你看看他們!!!!)


一桌滿滿的好料,有肉粽、手扒雞、星巴克咖啡等,真是太感謝了。


吃飽趁天還亮著,逛了一下營區,今日A區有八帳


盥洗區


共用洗水槽區


不久,[Crazy Family]因晚上六點半有事情,所以就先離開了
本來想說 [Crazy Family]也可以一起來露的說,真可惜,沒關係,機會多的是。

晚上到來,晚餐就吃熱呼呼的麵與[Crazy Family]留下來的手扒雞


由於是單飛,沒有[脩脩窩]的夜間電影院,還真不習慣
所以這次就開放 ipad 給小朋友打發夜間時間


而我就是到處走走看看,拍拍夜間照片


這次單飛,沒有[crazy Family] 與[脩脩窩 ]參與,一時之間還真不習慣,晚上變得好冷清,太安靜了
沒有紅酒喝、更沒有人可以聊天,我們夫妻倆只能滑滑手機,弄弄熱可可來打發夜晚時間,然後就去睡覺了

夜晚睡覺時,因為弟弟沒有安全感,一直作夢,光是起來上廁所就超過三次
晚上營地還蠻冷的,要注意保暖,起來上廁所一定要穿外套

今天晚上的霧氣很濃,整個天幕與外帳,都濕濕的
帳篷後方的小樹,不時會滴下水滴在外帳上,感覺很像睡在雨衣裡面
不過還好沒有下大雨

隔天一早起床,霧氣仍是沒有散去,整個天空濛濛的,該不會這次要收濕帳吧?


好險,到了十點半,太陽公公出來了


所有人掌握時間,馬上進行曬帳的動作,要收乾帳就要趁太陽公公了


光是收東西,就超過兩個小時,真的是體力活
不過為了收乾帳,再累也要收


最後請老闆幫我們拍了一張合照,讓第3露 [橫山仙境] 畫上完美的句點。


感謝[Crazy Family]前來探班、感謝[橫山仙境]老闆提供這樣好的環境,更要感謝天公伯的 [好天氣]。

最後貼上[橫山仙境公約]與 [ 食物價格表 ] 給大家參考


 
如果你有 [頭家愛露營]車貼,還可以打 九折歐 !!!
期待下次的露營~~~~~~~~~~ see you................















 
文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()


20160130-第3露橫山仙境(南投)-上篇(開帳、法蘭絨床包忘記帶)



自從第2露(2015/12/26)之後,天氣狀況開始不穩定
20160116週六下雨,導致[龍泉營地]延期,將改到 04/23
20160123的[帝王級寒流],導致[流星花園]取消
剛買的噴火龍帳篷一直沒有機會開帳,整個心情悶到不行

一直想開帳的心每逢周六日就會開始滾沸
想說,如果在過年前還是沒有露到營,真的會超悶的~~~
於是上網GOOGLE做功課,找了一個近一點的營地,進可攻、退可守
在1/26,馬上預定位於南投的[橫山仙境],官方網站如下:
http://www.0978298785.com.tw/about-us.html
老闆說1/30仍有位置,因距離1/30只剩下不到三天,老闆說不用匯訂金了,會幫我保留一帳的位置,真感心!

時間到了1/30當天早上,天氣仍是不好,七點左右看到天空仍有零星降雨
心都涼了一半,想說,該不會又不能露營了吧!?
家裡小朋友的寒假遊記作業,該不會全部都要寫[窩在家裡]吧?!

突然[Crazy Family]在十點左右,打電話來詢問[馴龍窩]是否有如期去露營,目前他們人在微熱山丘,且出太陽
見機不可失,馬上請[Crazy Family]幫忙前去[橫山仙境]營地,看看今日場地是否仍可以露營
不到廿分鐘[Crazy Family]傳來照片與好消息,場地沒有泥濘,且營主說今天只有差不多十帳的客人
收到這個好消息之後,馬上進入露營準備狀態,出發.......

從住處到[橫山仙境]不到半小時車程,真的是非常的近!
整個營區分布圖下,這次我們紮營的區域是C區,A區已經有七到八帳團體進駐了


老闆娘表示,今天C區只有三帳,帳篷可以隨便找一格搭,車子可以隨便找一格停。
一開始天上還下著毛毛細雨,整個C區營地都被大霧蓋住,可見度蠻低的
因為有小雨,我們夫妻倆就穿起雨衣,開始先搭天幕
一開始天幕是搭設成這樣


帳篷搭好之後,變成這樣


眼尖的你一定會發現,帳篷前面就是營柱,這樣不就沒有客廳了? 要在哪裡煮飯啊??
將照片line 到 [露營組]時,也被 [Crazy Family]發現,馬上打電話過來詢問,怎麼沒有客廳呢?
天幕這樣搭,真的無法有客廳,因為前後都會有一根營柱擋住,空間利用度差。

於是重搭天幕
因為我們買的天幕其實是噴火龍客廳帳的延伸天幕,它是梯形的,搭設天幕有很多眉眉角角要注意
真的是在考驗我們夫妻倆的智慧與創意
重搭後,變成這樣


側面看是這樣,側邊有拉一個水線


後面看是這樣,最後端有拉一個水線


從遠處看,還蠻像一隻蝴蝶的


我們的住處,在夜間濃霧下,看起來超像是一支手電筒的,光線從前方三角處發射出來

正個光線從天幕透射出來,還蠻好看的


今天晚上C區就被照片上這三帳給包了


夜間的洗手台感覺還蠻像BAR檯的


搭好帳篷、充飽床墊之後發現,自製的法蘭絨床包竟然忘記帶,這可是此次露營的重頭戲耶
下面是之前縫好時拍的照片,想說這次露營可以體會一下法蘭絨的觸感的。


如果這次沒有忘記帶的話,應該可以在冷冷的夜晚帶給我們溫暖的,真可惜,下次要將床包放進 check list裡。

第一天的中餐,我們是吃飯糰,並煎個香腸來補充體力。

接著一群人開始玩起 [曬香腸]的梗,說甚麼香腸掛在屋簷上,特別有感覺


搭好帳篷之後,接到 [Crazy Family]來電,說下午四、五點,要來探班並一起吃晚餐,真是太好了,露營就是要多人比較熱鬧。

待續.....
(請見 20160130-第3露橫山仙境(南投)-下篇(露營還是多人熱鬧、晴天收帳) )















 
文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

找更多相關文章與討論