OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@90 47198e57-cb75-475f-84c4-a814cd6...
[mimic/MiMicSDK.git] / misc / MiMicVM / api.js / LPCXPresso1769.Gpio.js
1 (function(){\r
2 var DEV=LPCXpresso1769;\r
3 var BCF=DEV._BCF;\r
4 var EE=DEV._EE;\r
5 var isUndef=MiMicLib.isUndef;\r
6 var cloneAssoc=MiMicLib.cloneAssoc;\r
7 \r
8 /**\r
9  * このクラスは、GPIOペリフェラルを管理します。
10  */\r
11 DEV.Gpio=function Gpio(i_mcu)\r
12 {\r
13         try{\r
14                 this._mcu=i_mcu;\r
15                 i_mcu.registerPhl(this,"GPIO");\r
16         }catch(e){\r
17                 throw new MiMicException(e);\r
18         }\r
19 }\r
20 DEV.Gpio.prototype={\r
21         _FIO_DIR :[0x2009C000,0x2009C020,0x2009C040,0x2009C060,0x2009C080],\r
22         _FIO_PIN :[0x2009C014,0x2009C034,0x2009C054,0x2009C074,0x2009C094],\r
23         _FIO_SET :[0x2009C018,0x2009C038,0x2009C058,0x2009C078,0x2009C098],\r
24         _FIO_CLR :[0x2009C01C,0x2009C03C,0x2009C05C,0x2009C07C,0x2009C09C],\r
25         _FIO_MASK:[0x2009C010,0x2009C030,0x2009C050,0x2009C070,0x2009C090],\r
26         _mcu:null,\r
27         /**\r
28          * ピン用のBCF生成関数
29          */\r
30         BCF_setDir:function BCF_setDir(i_ch,i_bit,i_dir,i_db)\r
31         {\r
32                 try{\r
33                         return BCF.setBit(this._FIO_DIR[i_ch],0x00000001,i_dir,i_bit,i_db);\r
34                 }catch(e){\r
35                         throw new MiMicException(e);\r
36                 }\r
37         },\r
38         BCF_setValue:function BCF_setValue(i_ch,i_bit,i_val,i_db)\r
39         {\r
40                 /*GPIOレジスタにセットするBC\r
41                 SGET #0;//GPIOの値レジスタアドレス\r
42                 SGET #1;//GPIOのMASKレジスタアドレス\r
43                 SGET #2;//MASKレジスタの値\r
44                 MPUT #2,#1;//MASK設定\r
45                 LD #2,0xffffffff\r
46                 MPUT #2,#0;//値セット\r
47                 */              \r
48                 try{\r
49                         if(i_val){\r
50                                 i_db.push(this._FIO_SET[i_ch],this._FIO_MASK[i_ch],~(0x00000001<<i_bit));\r
51                         }else{\r
52                                 i_db.push(this._FIO_CLR[i_ch],this._FIO_MASK[i_ch],~(0x00000001<<i_bit));\r
53                         }\r
54                         return "EA00EA01EA02DF0201FB02ffffffffDF0200";\r
55                 }catch(e){\r
56                         throw new MiMicException(e);\r
57                 }\r
58         },\r
59         BCF_getValue:function BCF_getValue(i_ch,i_bit,i_db)\r
60         {\r
61                 /*GPIOレジスタからとってくるBC\r
62                 SGET #0;//GPIOの値レジスタアドレス\r
63                 SGET #1;//GPIOのMASKレジスタアドレス\r
64                 SGET #2;//MASKレジスタの値\r
65                 MSET #2,#1;//MASK設定\r
66                 MGET #3,#0;//値取得\r
67                 SPUT #3;//SPUT\r
68                  */\r
69                 try{\r
70                         i_db.push(this._FIO_PIN[i_ch],this._FIO_MASK[i_ch],~(0x00000001<<i_bit));\r
71                         return "EA00EA01EA02DF0201DB0300EE03";\r
72                 }catch(e){\r
73                         throw new MiMicException(e);\r
74                 }               \r
75         },\r
76         /**\r
77          * @see API manual
78          */\r
79         getPin:function createPin(i_pin,i_opt)\r
80         {\r
81                 try{\r
82                         return new DEV.GpioPin(this,i_pin,i_opt);\r
83                 }catch(e){\r
84                         throw new MiMicException(e);\r
85                 }\r
86         }\r
87 \r
88 }\r
89 \r
90 /**\r
91  * @see API manual
92  */\r
93 DEV.GpioPin=function GpioPin(i_gpio,i_pin,i_opt)\r
94 {\r
95         try{\r
96                 //PINを作る。\r
97                 this._gpio=i_gpio;\r
98                 this._pin=new DEV.Pin(i_gpio._mcu,i_pin);\r
99                 //pinからGPIOに関するピン情報を計算。\r
100                 this._gpioinfo=function(i_pin)\r
101                 {\r
102                         //pinの完全な機能名を得る。(得られれば機能がある。)\r
103                         var func_name=DEV.completePinFunctionName(i_pin,"GPIO");\r
104                         //pin名からポートとビットを得る。\r
105                         var a=func_name.substring(4).split(".");\r
106                         //pin情報を構成。\r
107                         var r={port:parseInt(a[0]),bit:parseInt(a[1]),pin_sel:DEV.getPinSelByFunctionName(i_pin,func_name)};\r
108                         if(!isNaN(r.port) && !isNaN(r.bit)){\r
109                                 return r;\r
110                         }\r
111                         throw new MiMicException(EE.INVALID_CFG,"The pin has not GPIO fuction.");\r
112                 }(i_pin);\r
113                 //optの構成\r
114                 var opt=isUndef(i_opt)?{pin:{}}:\r
115                 {\r
116                         dir:i_opt.dir,\r
117                         pin:isUndef(i_opt.pin)?{}:cloneAssoc(i_opt.pin)\r
118                 }\r
119                 //デフォルト値\r
120                 if(isUndef(opt.pin.sel)){opt.pin.sel=this._gpioinfo.pin_sel;}\r
121                 //Pinのコンフィギュレーション\r
122                 this.setOpt(opt);\r
123         }catch(e){\r
124                 throw new MiMicException(e);\r
125         }\r
126 }\r
127 DEV.GpioPin.prototype=\r
128 {\r
129         _gpio:null,\r
130         _pin:null,//LPCXpressoのpin\r
131         _gpioinfo:null,//GPIOの情報{port,bit,pin_sel}\r
132         /**\r
133          * @see API manual
134          */\r
135         setOpt:function setOpt(i_opt)\r
136         {\r
137                 try{\r
138                         var bc="";\r
139                         var db=new Array();\r
140                         //dirの設定\r
141                         if(!isUndef(i_opt.dir)){\r
142                                 bc+=this._gpio.BCF_setDir(this._gpioinfo.port,this._gpioinfo.bit,i_opt.dir,db);\r
143                         }\r
144                         //pinselの値\r
145                         if(!isUndef(i_opt.pin)){\r
146                                 bc+=this._pin.BCF_setOpt(i_opt.pin,db);\r
147                         }\r
148                         //MiMicBCを生成して実行\r
149                         this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
150                 }catch(e){\r
151                         throw new MiMicException(e);\r
152                 }\r
153         },\r
154         /**\r
155          * @see API manual.
156          */\r
157         setValue:function setValue(i_val)\r
158         {\r
159                 try{\r
160                         var bc="";\r
161                         var db=new Array();\r
162                         bc+=this._gpio.BCF_setValue(this._gpioinfo.port,this._gpioinfo.bit,i_val,db);\r
163                         this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
164                 }catch(e){\r
165                         throw new MiMicException(e);\r
166                 }\r
167         },      \r
168         /**\r
169          * @see API manual.\r
170          */\r
171         getValue:function getValue()\r
172         {\r
173 \r
174                 try{\r
175                         var bc="";\r
176                         var db=new Array();\r
177                         bc+=this._gpio.BCF_getValue(this._gpioinfo.port,this._gpioinfo.bit,db);\r
178                         var ret=this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
179                         return (ret.stream[0]>>this._gpioinfo.bit)&0x01;\r
180                 }catch(e){\r
181                         throw new MiMicException(e);\r
182                 }\r
183         },\r
184         /**\r
185          * ビットパターンを出力します。\r
186          @param i_val_array\r
187          Array[int]:ビットパターンです。[0,1,0,1]の場合、0,1,0,1の順に、パターンを出力します。\r
188          最大数は20です。\r
189          @remark\r
190          最適化対象\r
191          */\r
192         outPatt:function outPatt(i_val_array)\r
193         {\r
194                 try{\r
195                         var bc="";\r
196                         var db=new Array();\r
197                         for(var i=0;i<i_val_array.length;i++){\r
198                                 bc+=this._gpio.BCF_setValue(this._gpioinfo.port,this._gpioinfo.bit,i_val_array[i],db);\r
199                         }\r
200                         this._gpio._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
201                 }catch(e){\r
202                         throw new MiMicException(e);\r
203                 }\r
204         },\r
205         \r
206 }\r
207 \r
208 }());\r