OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@96 47198e57-cb75-475f-84c4-a814cd6...
[mimic/MiMicSDK.git] / misc / MiMicVM / api.js / LPCXpresso1769.Peripheral.js
1 /**\r
2  * @fileOverview LPCXpresso1769の物理ペリフェラルを制御するクラスを定義する。\r
3  */\r
4 (function(){\r
5 var DEV=LPCXpresso1769;\r
6 var BCF=DEV._BCF;\r
7 var EE=DEV._EE;\r
8 var isUndef=MiMicLib.isUndef;\r
9 /**\r
10  * LPCXPresso1769.Peripheral (Peripheral)クラスのコンストラクタ。\r
11  * ペリフェラル識別子を元に、MCUに関連付けしたPeripheral インスタンスを生成する。\r
12  * Peripheralクラスは、物理Peripheral(主に電源/クロックブロック単位)単位に操作インタフェイスを定義する。\r
13  * PCLKSEL,PCONPレジスタを管理する。\r
14  * このクラスは、抽象ペリフェラルクラスへ物理ペリフェラルの基本的な操作機能を提供する為のものであり、ユーザが直接使用することは(あまり)ない。\r
15  * 関数はMiMicの管理しているペリフェラル(ENET)も操作することが出来るが、操作してしまうとMiMicRemoteMcuとのコネクションが破壊されるので、注意すること。\r
16  * @name LPCXpresso1769.Peripheral\r
17  * @constructor\r
18  * @param {object as LPCXpresso1769.Mcu} i_mcu\r
19  * インスタンスを結びつけるMcuオブジェクト。\r
20  * @param {object as ペリフェラル識別子} i_phl\r
21  * 生成するペリフェラルのペリフェラル識別子。この値は、LPCXpresso1769.PHLの要素である。\r
22  * @param {object as associative array} i_opt\r
23  * インスタンス生成と同時にsetOpt関数で設定する値。省略時は無視する。\r
24  * 詳細はsetOpt関数を参照。\r
25  * @example\r
26  * //create GPIO peripheral\r
27  * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”);\r
28  * var phl=new LPCXpresso1769.Pheripheral(mcu,LPCXpresso.PHL.GPIO); \r
29  */\r
30 DEV.Peripheral=function(i_mcu,i_phl,i_opt)\r
31 {\r
32         try{\r
33                 if(isUndef(i_phl)){\r
34                         throw new MiMicException(EE.INVALID_PHL);\r
35                 }\r
36                 this._mcu=i_mcu;\r
37                 this._phl=i_phl;\r
38                 //オプション設定するならする。\r
39                 if(!isUndef(i_opt)){\r
40                         this.setOpt(i_opt);\r
41                 }\r
42         }catch(e){\r
43                 throw new MiMicException(e);\r
44         }       \r
45 }\r
46 DEV.Peripheral.prototype=\r
47 {\r
48         _PCLKSEL:[0x400FC1A8,0x400FC1AC],\r
49         _PCONP:0x400FC0C4,\r
50         _phl:null,\r
51         _mcu:null,\r
52         _cache:{\r
53                 pclk:0\r
54         },\r
55         /**\r
56          * BCフラグメントを生成して、_cacheを更新します。\r
57          * @private
58          */\r
59         BCF_setOpt:function BCF_setOpt(i_opt,i_db)\r
60         {\r
61                 try{\r
62                         var bc="";\r
63                         //pconp\r
64                         if(!isUndef(i_opt.power)){\r
65                                 if(this._phl[2]==null){\r
66                                         throw new MiMicException(EE.INVALID_CFG,"The pin does not support PCONP.");\r
67                                 }\r
68                                 //pinselAddrを得る\r
69                                 bc+=BCF.setBit(this._PCONP,0x00000001,i_opt.power,this._phl[2],i_db);\r
70                         }\r
71                         //clock\r
72                         if(!isUndef(i_opt.clock)){\r
73                                 if(this._phl[0]==null){\r
74                                         throw new MiMicException(EE.INVALID_CFG,"The pin does not support PCLKSEL.");\r
75                                 }\r
76                                 //キャッシュ更新\r
77                                 this._cache.pclk=i_opt.clock;\r
78                                 bc+=BCF.setBit(this._PCLKSEL[this._phl[0]],0x00000003,i_opt.clock,this._phl[1],i_db);\r
79                         }\r
80                         return bc;\r
81                 }catch(e){\r
82                         throw new MiMicException(e);\r
83                 }               \r
84         },\r
85         /**\r
86          * ペリフェラルにオプションパラメータをセットする。\r
87          * 関数は、物理ペリフェラルのレジスタに、i_optで与えられる値を設定する。\r
88          * 関数は、レジスタの位置に合わせてパラメータ値を自動的にシフトする。   \r
89          * @name LPCXpresso1769.Peripheral#setOpt\r
90          * @function\r
91          * @param {object} i_opt\r
92          * ペリフェラルピンコンフィグレーションのパラメタである。必要な値を格納した連想配列で指定する。\r
93          * 全ての値を省略することは出来ない。連想配列のメンバは以下の通り。\r
94          * <pre>{power:int,clock:int}</pre>\r
95          * <ul>\r
96          * <li>power:int -\r
97          * 1bitのint値。 PCONP? レジスタに指定する値。Chapter 4: LPC17xx Clocking and power controlを参照。\r
98          * </li>\r
99          * <li>clock:int - \r
100          * 2bitのint値。PCLKSEL? レジスタに指定する値。Chapter 4: LPC17xx Clocking and power controlを参照。\r
101          * </li>\r
102          * @example \r
103          * //set DAC power on\r
104          * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”);\r
105          * var phl=new LPCXpresso1769.Peripheral(mcu,LPCXpresso.PHL.ADC);\r
106          * phl.setOpt({power:1});        \r
107          */\r
108         setOpt:function setOpt(i_opt)\r
109         {\r
110                 try{\r
111                         var db=new Array();\r
112                         var bc=this.BCF_setOpt(i_opt,db);\r
113                         if(bc.length==0){\r
114                                 throw new MiMicException("i_opt is empty or invalid.");\r
115                         }\r
116                         //MiMicBCを生成して実行\r
117                         this._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
118 \r
119                 }catch(e){\r
120                         throw new MiMicException(e);\r
121                 }\r
122                 return;         \r
123         },\r
124         /**\r
125          * ペリフェラルのクロックを[Hz]単位で返す。\r
126          * クロックは、Table 42. Peripheral Clock Selection register bit valuesと、MCUのクロック(LPCXpresso1769.Mcuの提供する値)から計算する。\r
127          * 動作中のPLL0の変更には対応していない。注意すること。\r
128          * @name LPCXpresso1769.Peripheral#getPCLK\r
129          * @function\r
130          * @return {int}\r
131          * Hz単位のペリフェラルクロック\r
132          * @example\r
133          * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”);\r
134          * var phl=new LPCXpresso1769.Peripheral(mcu,LPCXpresso.PHL.PWM);\r
135          * alert(phl.getPCLK());\r
136          */\r
137         getPCLK:function getPCLK()\r
138         {\r
139                 try{\r
140                         //倍率変換テーブル\r
141                         var m=[4,1,2,0];\r
142                         var t=m[this._cache.pclk];\r
143                         var r;\r
144                         if(t==0){\r
145                                 if(this._phl===DEV.PHL.CAN1 || this._phl===DEV.PHL.CAN2){\r
146                                         r=this._mcu.getClockInfo().cclk/6;\r
147                                 }else{\r
148                                         r=this._mcu.getClockInfo().cclk/8;\r
149                                 }\r
150                         }else{\r
151                                 r=this._mcu.getClockInfo().cclk/t;\r
152                         }\r
153                         return Math.round(r);\r
154                 }catch(e){\r
155                         throw new MiMicException(e);\r
156                 }\r
157         }\r
158 }\r
159 \r
160 }());