1 /** 2 * @fileOverview LPCXpresso1769のポート(ピンセット)を制御するクラスを定義する。 3 */ 4 5 (function(){ 6 var DEV=LPCXpresso1769; 7 var BCF=DEV._BCF; 8 var EE=DEV._EE; 9 var isUndef=MiMicLib.isUndef; 10 11 /** 12 * @private 13 * レジスタの内容 14 */ 15 var REG={ 16 _PINSEL:[0x4002C000,0x4002C004,0x4002C008,0x4002C00C,0x4002C010,null,null,0x4002C0C0,null,0x4002C024,0x4002C028], 17 _PINMODE:[0x4002C040,0x4002C044,0x4002C048,0x4002C04C,0x4002C050,0x4002C054,0x4002C058,0x4002C05C,null,0x4002C064], 18 _PINMODE_OD:[0x4002C068,0x4002C06C,0x4002C070,0x4002C074,0x4002C078], 19 }; 20 /** 21 * LPCXPresso1769.Port (Port)クラスのコンストラクタ。 22 * ピン識別子を元に、MCUに関連付けたPortインスタンスを生成する。 23 * Portクラスは、複数の物理ピンをまとめて、操作インタフェイスを定義する。 24 * PINSEL,PINMODE,PINMODE_ODレジスタを管理する。 25 * @name LPCXpresso1769.Port 26 * @constructor 27 * @param {object as LPCXpresso1769.Mcu} i_mcu 28 * インスタンスを結びつけるMcuオブジェクト。 29 * @param {array[object as ピン識別子]} i_pin 30 * ポートを構成するピンの配列。 31 * @param {array[object as associative array]} i_opt 32 * インスタンス生成と同時にsetOpt関数で設定する値。省略時は無視する。 33 * 詳細はsetOpt関数を参照。 34 * このクラスは、上位クラスへピンの基本的な操作機能を提供する為のものであり、ユーザが直接使用することは(あまり)ない。 35 * この関数は、MiMicの管理しているピン(ENET_?)も操作することが出来るが、操作してしまうとMiMicRemoteMcuとのコネクションが破壊されるので、注意すること。 36 * @example 37 * //create pin instance at P0[0] 38 * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”); 39 * var port=new LPCXpresso1769.Port(mcu,[LPCXpresso.P0[0]]); 40 */ 41 DEV.Port=function Port(i_mcu,i_pins,i_opts) 42 { 43 try{ 44 this._mcu=i_mcu; 45 this._pininfo=new Array(); 46 //ピン情報に変換 47 for(var i=0;i<i_pins.length;i++){ 48 this._pininfo.push(DEV.getPinRegInfo(i_pins[i])); 49 } 50 if(!isUndef(i_opts)){ 51 this.setOpts(i_opts); 52 } 53 }catch(e){ 54 throw new MiMicException(e); 55 } 56 } 57 58 DEV.Port.prototype= 59 { 60 _mcu:null, 61 /** 62 * 複数のピン設定をレジスタごとにまとめたBCを生成する。 63 @private 64 */ 65 BCF_setOpts:function BCF_setOpts(i_opts,i_db) 66 { 67 try{ 68 //10/5レジスタ分のワーク領域を作る。 69 var d={ 70 selr:[0,0,0,0,0,0,0,0,0,0], 71 selr_mask:[0,0,0,0,0,0,0,0,0,0], 72 modr:[0,0,0,0,0,0,0,0,0,0], 73 modr_mask:[0,0,0,0,0,0,0,0,0,0], 74 odr:[0,0,0,0,0], 75 odr_mask:[0,0,0,0,0]}; 76 77 //pinsとoptsの数は同じだよね? 78 if(this._pininfo.length!=i_opts.length){ 79 throw new MiMicException(); 80 } 81 82 //レジスタ値、マスクの生成 83 for(var i=0;i<i_opts.length;i++) 84 { 85 var pi=this._pininfo[i]; 86 var opt=i_opts[i]; 87 if(!isUndef(opt.sel)) 88 { 89 d.selr[pi.s]|=(opt.sel<<pi.smb); 90 d.selr_mask[pi.s]|=(0x3<<pi.smb); 91 } 92 if(!isUndef(opt.mode)) 93 { 94 d.modr[pi.m]|=(opt.mode<<pi.smb); 95 d.modr_mask[pi.m]|=(0x3<<pi.smb); 96 } 97 if(!isUndef(opt.od)) 98 { 99 d.odr[pi.o]|=(opt.od<<pi.ob); 100 d.odr_mask[pi.o]|=(0x1<<pi.ob); 101 } 102 } 103 //BCFを生成 104 var bc=""; 105 for(var i=0;i<10;i++){ 106 if(d.selr_mask[i]!=0x0){ 107 bc+=BCF.setBit(REG._PINSEL[i],d.selr_mask[i],d.selr[i],0,i_db); 108 } 109 if(d.modr_mask[i]!=0x0){ 110 bc+=BCF.setBit(REG._PINMODE[i],d.modr_mask[i],d.modr[i],0,i_db); 111 } 112 } 113 for(var i=0;i<5;i++){ 114 if(d.odr_mask[i]!=0x0){ 115 bc+=BCF.setBit(REG._PINMODE_OD[i],d.odr_mask[i],d.odr[i],0,i_db); 116 } 117 } 118 return bc; 119 }catch(e){ 120 throw new MiMicException(e); 121 } 122 }, 123 /** 124 * ポートにオプションパラメータをセットする。 125 * 関数は、ポートを構成するピンに、ピンオプション配列の値を個別に設定する。 126 * @name LPCXpresso1769.Port#setOpts 127 * @function 128 * @param {array[object as associative array]} i_opts 129 * ピンコンフィグレーションのパラメタの配列である。個々の要素は、ピンオプションである。ピンオプションの構造は、Pin#setOptを参照。 130 * 配列の要素数は、ポートを構成するピンの数と同じでなければならない。 131 * @example 132 * //set GPIO,mode=1,open drain=0 133 * var mcu=new LPCXpresso1769.Mcu(“192.168.0.39”); 134 * var port=new LPCXpresso1769.Port(mcu,[LPCXpresso.P2[3],LPCXpresso.P2[4]]); 135 * port.setOpts([{sel:0,mode:1,od:0},{sel:0,mode:1,od:0}]); 136 */ 137 setOpts:function setOpts(i_opts) 138 { 139 try{ 140 var db=new Array(); 141 var bc=this.BCF_setOpts(i_opts,db); 142 if(bc.length==0){ 143 throw new MiMicException("i_opt is empty or invalid."); 144 } 145 //MiMicBCを生成して実行 146 this._mcu.callMiMicWithCheck(bc+BCF.END,db); 147 }catch(e){ 148 throw new MiMicException(e); 149 } 150 return; 151 } 152 } 153 154 }());