- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/asp3_dcre/tinet/netdev/if_rx62n/ether_phy.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;charset=UTF-8
r388 r389 6 6 * Copyright (C) 2014-2017 by Cores Co., Ltd. Japan 7 7 * 8 * ä¸è¨èä½æ¨©è 9 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 10 * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 11 * å¤ã»åé 12 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 13 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 14 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 15 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 16 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 17 * ç¨ã§ããå½¢ã§åé 18 å¸ããå ´åã«ã¯ï¼åé 19 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 20 * è 21 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 22 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 23 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 24 * ç¨ã§ããªãå½¢ã§åé 25 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 26 * ã¨ï¼ 27 * (a) åé 28 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 29 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 30 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 31 * (b) åé 32 å¸ã®å½¢æ 33 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 34 * å ±åãããã¨ï¼ 35 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 36 * 害ãããï¼ä¸è¨èä½æ¨©è 37 ããã³TOPPERSããã¸ã§ã¯ããå 38 責ãããã¨ï¼ 39 * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 40 * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 41 ããã³TOPPERSããã¸ã§ã¯ãã 42 * å 43 責ãããã¨ï¼ 8 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 10 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 13 * スコード中に含まれていること. 14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 15 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 16 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 17 * の無保証規定を掲載すること. 18 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 19 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 20 * と. 21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 22 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 23 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 24 * 報告すること. 25 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 26 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 27 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 28 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 29 * 免責すること. 44 30 * 45 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 46 ã 47 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 48 * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 49 * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 50 * ã®è²¬ä»»ãè² ããªãï¼ 31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 33 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 34 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 35 * の責任を負わない. 51 36 * 52 37 * @(#) $Id$ … … 109 94 switch(state){ 110 95 case PHY_STATE_UNINIT: 111 /* PHY ã®ãªã»ãã*/96 /* PHYのリセット */ 112 97 phy_write_reg(phy_addr, PHY_CONTROL_REGISTER, PHY_CONTROL_RESET); 113 98 114 /* 500mså¾ 115 㤠*/ 99 /* 500ms待つ */ 116 100 dly_tsk(500 * 1000); 117 101 /* continue; */ 118 102 case PHY_STATE_RESETING: 119 /* ãªã»ããå®äºã®ç¢ºèª*/103 /* リセット完了の確認 */ 120 104 if((phy_read_reg(phy_addr, PHY_CONTROL_REGISTER) & PHY_CONTROL_RESET) != 0) 121 105 return PHY_STATE_RESETING; … … 137 121 switch(state){ 138 122 case PHY_STATE_RESET: 139 /* ãªã¼ããã´ã·ã¨ã¼ã·ã§ã³ã®ãç¥ãããæå¹ã«è¨å®*/123 /* オートネゴシエーションのお知らせを有効に設定 */ 140 124 phy_write_reg(phy_addr, PHY_AN_ADVERTISEMENT_REGISTER, 141 125 PHY_AN_AD_100BASE_T4 | PHY_AN_AD_100BASE_TX_FULL_DUPLEX | PHY_AN_AD_100BASE_TX_HALF_DUPLEX 142 126 | PHY_AN_AD_10BASE_T_FULL_DUPLEX | PHY_AN_AD_10BASE_T_HALF_DUPLEX | PHY_AN_AD_SELECTOR_FIELD); 143 127 144 /* ãªã¼ããã´ã·ã¨ã¼ã·ã§ã³ãæå¹ã«è¨å®*/128 /* オートネゴシエーションを有効に設定 */ 145 129 phy_write_reg(phy_addr, PHY_CONTROL_REGISTER, PHY_CONTROL_SPEED_SELECT | PHY_CONTROL_A_N_ENABLE); 146 130 /* continue; */ … … 150 134 if(reset < 2){ 151 135 #endif 152 /* ãªã³ã¯å®äºã®ç¢ºèª*/136 /* リンク完了の確認 */ 153 137 if(!phy_is_link(phy_addr)) 154 138 return PHY_STATE_LINKE_WAIT; … … 163 147 if(reset < 2){ 164 148 #endif 165 /* ãªã¼ããã´ã·ã¨ã¼ã·ã§ã³å®äºã®ç¢ºèª*/149 /* オートネゴシエーション完了の確認 */ 166 150 if((phy_read_reg(phy_addr, PHY_STATUS_REGISTER) & PHY_STATUS_A_N_COMPLETE) == 0) 167 151 return PHY_STATE_LINKED; … … 186 170 { 187 171 #if !defined(_MSC_VER) && !defined(__c2__) 188 /* ãªã³ã¯ã®ç¢ºèª*/172 /* リンクの確認 */ 189 173 return (phy_read_reg(phy_addr, PHY_STATUS_REGISTER) & PHY_STATUS_LINK_STATUS) != 0; 190 174 #else … … 198 182 int i; 199 183 200 /* PRE ï¼32åã®é£ç¶ãã1b */184 /* PRE :32個の連続した1b */ 201 185 for (i = 0; i < 32; i++) 202 186 phy_write_bit(true); 203 187 204 /* ST ï¼ãã¬ã¼ã ã®å 205 é ã示ã01bã®ã©ã¤ã */ 206 phy_write_bit(false); 207 phy_write_bit(true); 208 209 /* OP ï¼ã¢ã¯ã»ã¹ç¨®å¥ã示ãã³ã¼ãã®ã©ã¤ã */ 210 phy_write_bit(true); 211 phy_write_bit(false); 212 213 /* PHYAD ï¼PHY-LSIã®ã¢ãã¬ã¹ã1çªã®å ´åã00001bãã©ã¤ãï¼MSB ããé 次ã©ã¤ãï¼ã */ 188 /* ST :フレームの先頭を示す01bのライト */ 189 phy_write_bit(false); 190 phy_write_bit(true); 191 192 /* OP :アクセス種別を示すコードのライト */ 193 phy_write_bit(true); 194 phy_write_bit(false); 195 196 /* PHYAD :PHY-LSIのアドレスが1番の場合、00001bをライト(MSB から順次ライト)。 */ 214 197 phy_write_bit((phy_addr & 0x10) != 0); 215 198 phy_write_bit((phy_addr & 0x08) != 0); … … 218 201 phy_write_bit((phy_addr & 0x01) != 0); 219 202 220 /* REGAD ï¼ã¬ã¸ã¹ã¿ã¢ãã¬ã¹ã1çªã®å ´åã00001bãã©ã¤ãï¼MSBããé 次ã©ã¤ãï¼ã*/203 /* REGAD :レジスタアドレスが1番の場合、00001bをライト(MSBから順次ライト)。 */ 221 204 phy_write_bit((reg_addr & 0x10) != 0); 222 205 phy_write_bit((reg_addr & 0x08) != 0); … … 225 208 phy_write_bit((reg_addr & 0x01) != 0); 226 209 227 /* TA ï¼MII/RMIIã¤ã³ã¿ãã§ã¼ã¹ä¸ã§ãã¼ã¿ã®éä¿¡å 228 ãåãæ¿ããæé */ 229 /* ããã¹è§£æ¾ãï¼Z0ã¨è¡¨è¨ï¼ãè¡ã */ 210 /* TA :MII/RMIIインタフェース上でデータの送信元を切り替える時間 */ 211 /* 「バス解放」(Z0と表記)を行う */ 230 212 phy_release_bus(); 231 213 232 /* DATA ï¼16ãããã®ãã¼ã¿ãMSBããé 次ãªã¼ã*/214 /* DATA :16ビットのデータ。MSBから順次リード */ 233 215 for (bit = 0x8000; bit != 0; bit >>= 1) { 234 216 if(phy_read_bit()) … … 236 218 } 237 219 238 /* IDLE ï¼æ¬¡ã®MII管çãã©ã¼ãããå 239 ¥åã¾ã§ã®å¾ 240 æ©æé */ 241 /* ãã§ã«TAæã«ãã¹è§£æ¾æ¸ã¿ã§ããå¶å¾¡ä¸è¦ */ 220 /* IDLE :次のMII管理フォーマット入力までの待機時間 */ 221 /* すでにTA時にバス解放済みであり制御不要 */ 242 222 phy_release_bus(); 243 223 … … 250 230 uint16_t bit; 251 231 252 /* PRE ï¼32åã®é£ç¶ãã1b */232 /* PRE :32個の連続した1b */ 253 233 for (i = 0; i < 32; i++) 254 234 phy_write_bit(true); 255 235 256 /* ST ï¼ãã¬ã¼ã ã®å 257 é ã示ã01bã®ã©ã¤ã */ 258 phy_write_bit(false); 259 phy_write_bit(true); 260 261 /* OP ï¼ã¢ã¯ã»ã¹ç¨®å¥ã示ãã³ã¼ãã®ã©ã¤ã */ 262 phy_write_bit(false); 263 phy_write_bit(true); 264 265 /* PHYAD ï¼PHY-LSIã®ã¢ãã¬ã¹ã1çªã®å ´åã00001bãã©ã¤ãï¼MSB ããé 次ã©ã¤ãï¼ã */ 236 /* ST :フレームの先頭を示す01bのライト */ 237 phy_write_bit(false); 238 phy_write_bit(true); 239 240 /* OP :アクセス種別を示すコードのライト */ 241 phy_write_bit(false); 242 phy_write_bit(true); 243 244 /* PHYAD :PHY-LSIのアドレスが1番の場合、00001bをライト(MSB から順次ライト)。 */ 266 245 phy_write_bit((phy_addr & 0x10) != 0); 267 246 phy_write_bit((phy_addr & 0x08) != 0); … … 270 249 phy_write_bit((phy_addr & 0x01) != 0); 271 250 272 /* REGAD ï¼ã¬ã¸ã¹ã¿ã¢ãã¬ã¹ã1çªã®å ´åã00001bãã©ã¤ãï¼MSBããé 次ã©ã¤ãï¼ã*/251 /* REGAD :レジスタアドレスが1番の場合、00001bをライト(MSBから順次ライト)。 */ 273 252 phy_write_bit((reg_addr & 0x10) != 0); 274 253 phy_write_bit((reg_addr & 0x08) != 0); … … 277 256 phy_write_bit((reg_addr & 0x01) != 0); 278 257 279 /* TA ï¼MII/RMIIã¤ã³ã¿ãã§ã¼ã¹ä¸ã§ãã¼ã¿ã®éä¿¡å 280 ãåãæ¿ããæé */ 281 /* 10bãã©ã¤ã */ 282 phy_write_bit(true); 283 phy_write_bit(false); 284 285 /* DATA ï¼16ãããã®ãã¼ã¿ãMSBããé 次ã©ã¤ã */ 258 /* TA :MII/RMIIインタフェース上でデータの送信元を切り替える時間 */ 259 /* 10bをライト */ 260 phy_write_bit(true); 261 phy_write_bit(false); 262 263 /* DATA :16ビットのデータ。MSBから順次ライト */ 286 264 for (bit = 0x8000; bit != 0; bit >>= 1) { 287 265 phy_write_bit((reg_data & bit) != 0); 288 266 } 289 267 290 /* IDLE ï¼æ¬¡ã®MII管çãã©ã¼ãããå 291 ¥åã¾ã§ã®å¾ 292 æ©æé */ 293 /* ãåç¬ãã¹è§£æ¾ãï¼Xã¨è¡¨è¨ï¼ãè¡ã */ 268 /* IDLE :次のMII管理フォーマット入力までの待機時間 */ 269 /* 「単独バス解放」(Xと表記)を行う */ 294 270 phy_single_rel_bus(); 295 271 } … … 298 274 299 275 /* 300 * 1 ããããã¼ã¿ã®ã©ã¤ã276 * 1 ビットデータのライト 301 277 */ 302 278 static void phy_write_bit(bool_t bit) … … 305 281 uint32_t data = bit ? ETHERC_PIR_MDO : 0; 306 282 307 /* PHY é¨ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¸ã¹ã¿ã¸ã®ã©ã¤ã*/283 /* PHY部インタフェースレジスタへのライト */ 308 284 sil_wrw_mem(ETHERC_PIR, data | ETHERC_PIR_MMD | 0/*ETHERC_PIR_MDC*/); 309 285 310 286 for(i = ETHERC_PIR_WAIT; i > 0; i--); 311 287 312 /* PHY é¨ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¸ã¹ã¿ã¸ã®ã©ã¤ã*/288 /* PHY部インタフェースレジスタへのライト */ 313 289 sil_wrw_mem(ETHERC_PIR, data | ETHERC_PIR_MMD | ETHERC_PIR_MDC); 314 290 315 291 for(i = 2 * ETHERC_PIR_WAIT; i > 0; i--); 316 292 317 /* PHY é¨ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¸ã¹ã¿ã¸ã®ã©ã¤ã*/293 /* PHY部インタフェースレジスタへのライト */ 318 294 sil_wrw_mem(ETHERC_PIR, data | ETHERC_PIR_MMD | 0/*ETHERC_PIR_MDC*/); 319 295 … … 322 298 323 299 /* 324 * ãã¹è§£æ¾300 * バス解放 325 301 */ 326 302 static void phy_release_bus() … … 328 304 int i; 329 305 330 /* PHY é¨ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¸ã¹ã¿ã¸ã®ã©ã¤ã*/306 /* PHY部インタフェースレジスタへのライト */ 331 307 sil_wrw_mem(ETHERC_PIR, 0/*ETHERC_PIR_MMD*/ | 0/*ETHERC_PIR_MDC*/); 332 308 333 309 for(i = ETHERC_PIR_WAIT; i > 0; i--); 334 310 335 /* PHY é¨ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¸ã¹ã¿ã¸ã®ã©ã¤ã*/311 /* PHY部インタフェースレジスタへのライト */ 336 312 sil_wrw_mem(ETHERC_PIR, 0/*ETHERC_PIR_MMD*/ | ETHERC_PIR_MDC); 337 313 338 314 for(i = 2 * ETHERC_PIR_WAIT; i > 0; i--); 339 315 340 /* PHY é¨ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¸ã¹ã¿ã¸ã®ã©ã¤ã*/316 /* PHY部インタフェースレジスタへのライト */ 341 317 sil_wrw_mem(ETHERC_PIR, 0/*ETHERC_PIR_MMD*/ | 0/*ETHERC_PIR_MDC*/); 342 318 … … 345 321 346 322 /* 347 * 1 ããããã¼ã¿ã®ãªã¼ã323 * 1 ビットデータのリード 348 324 */ 349 325 static bool_t phy_read_bit() … … 354 330 for(i = ETHERC_PIR_WAIT; i > 0; i--); 355 331 356 /* PHY é¨ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¸ã¹ã¿ã¸ã®ã©ã¤ã*/332 /* PHY部インタフェースレジスタへのライト */ 357 333 sil_wrw_mem(ETHERC_PIR, 0/*ETHERC_PIR_MMD*/ | ETHERC_PIR_MDC); 358 334 359 335 for(i = ETHERC_PIR_WAIT; i > 0; i--); 360 336 361 /* PHY é¨ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¸ã¹ã¿ã¸ã®ã©ã¤ã*/337 /* PHY部インタフェースレジスタへのライト */ 362 338 bit = (sil_rew_mem(ETHERC_PIR) & ETHERC_PIR_MDI) != 0; 363 339 364 340 for(i = ETHERC_PIR_WAIT; i > 0; i--); 365 341 366 /* PHY é¨ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¸ã¹ã¿ã¸ã®ã©ã¤ã*/342 /* PHY部インタフェースレジスタへのライト */ 367 343 sil_wrw_mem(ETHERC_PIR, 0/*ETHERC_PIR_MMD*/ | 0/*ETHERC_PIR_MDC*/); 368 344 … … 373 349 374 350 /* 375 * åç¬ãã¹è§£æ¾351 * 単独バス解放 376 352 */ 377 353 static void phy_single_rel_bus() … … 381 357 for(i = ETHERC_PIR_WAIT; i > 0; i--); 382 358 383 /* PHY é¨ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¸ã¹ã¿ã¸ã®ã©ã¤ã*/359 /* PHY部インタフェースレジスタへのライト */ 384 360 sil_wrw_mem(ETHERC_PIR, ETHERC_PIR_MMD | ETHERC_PIR_MDC); 385 361 386 362 for(i = 2 * ETHERC_PIR_WAIT; i > 0; i--); 387 363 388 /* PHY é¨ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¸ã¹ã¿ã¸ã®ã©ã¤ã*/364 /* PHY部インタフェースレジスタへのライト */ 389 365 sil_wrw_mem(ETHERC_PIR, 0/*ETHERC_PIR_MMD*/ | 0/*ETHERC_PIR_MDC*/); 390 366
Note:
See TracChangeset
for help on using the changeset viewer.