摘è¦ï¼š 本文分æžäº†Linux系統ä¸I2C驅動程åºçš„çµæ§‹ï¼Œå¹¶ä»¥AT91RM9200å’ŒX1227為例,介紹了如何在嵌入å¼Linux系統ä¸å¯¦ç¾I2C總線é©é…器åŠI2Cè¨å‚™é©…動。
é—œéµè©žï¼š Linux I2C總線 I2Cè¨å‚™ é©…å‹•
引言
I2C總線是PHILIPSå…¬å¸æŽ¨å‡ºçš„å…©ç·šå¼ä¸²è¡Œç¸½ç·šï¼Œç”¨äºŽé€£æŽ¥å¾®æŽ§åˆ¶å™¨åŠå…¶å¤–åœè¨å‚™ï¼Œå…·æœ‰ç°¡å–®ã€é«˜æ•ˆç‰ç‰¹é»žã€‚由于其接å£ç›´æŽ¥åœ¨çµ„ä»¶ä¹‹ä¸Šï¼Œå› æ¤I2C總線å 用的空間éžå¸¸å°ï¼Œæ¸›å°‘了電路æ¿çš„空間和芯片引腳的數é‡ï¼Œé™ä½Žäº†äº’è¯æˆæœ¬ï¼Œç‰¹åˆ¥é©ç”¨äºŽåµŒå…¥å¼ç”¢å“。
而Linux系統具有開æºã€å…è²»ã€ç¶²ä¸Šè³‡æºè±å¯Œç‰å„ªé»žï¼Œç›®å‰å·²æˆç‚ºåµŒå…¥å¼ç³»çµ±çš„主æµé¸æ“‡ã€‚å› æ¤å¦‚何在嵌入å¼Linux系統ä¸å¯¦ç¾I2C功能æˆç‚ºå¯¦éš›é–‹ç™¼ä¸çš„å•題。
1.I2C總線
I2C 總線通éŽä¸²è¡Œæ•¸æ“šSDA 和串行時é˜SCL線在連接到總線的器件間傳éžä¿¡æ¯ï¼Œæ¯å€‹å™¨ä»¶éƒ½æœ‰ä¸€å€‹å”¯ä¸€çš„地å€è˜åˆ¥ã€‚æ ¹æ“šæ•¸æ“šå‚³è¼¸æ™‚çš„åŠŸèƒ½ä¸åŒï¼ŒæŠŠå™¨ä»¶åˆ†ç‚ºä¸»æ©Ÿå’Œå¾žæ©Ÿã€‚主機是åˆå§‹åŒ–總線的數據傳輸并產生å…許傳輸的時é˜ä¿¡è™Ÿçš„å™¨ä»¶ï¼Œé€šå¸¸æ˜¯å¾®æŽ§åˆ¶å™¨ã€‚æ¤æ™‚,任何被尋å€çš„器件都被èªç‚ºæ˜¯å¾žæ©Ÿï¼Œä¾‹å¦‚LCD驅動器ã€E2PROMç‰ã€‚
I2C總線å”è°è¦å®šï¼Œå„ä¸»æ©Ÿé€²è¡Œé€šä¿¡æ™‚éƒ½è¦æœ‰èµ·å§‹ã€çµæŸã€ç™¼é€æ•¸æ“šå’Œæ‡‰ç”信號。這些信號都是通信éŽç¨‹ä¸çš„基本單元。起始信號就是在SCL線為高時SDAç·šå¾žé«˜è®ŠåŒ–åˆ°ä½Žï¼›åœæ¢ä¿¡è™Ÿå°±æ˜¯åœ¨SCL線為高時SDA線從低變化到高;應ç”信號是在SCL為高時SDAç‚ºä½Žï¼›éžæ‡‰ç”信號相å,是在SCL為高時SDA為高。
總線傳é€çš„æ¯1å¹€æ•¸æ“šå‡æ˜¯1個å—節。å”è°è¦å®šï¼Œåœ¨å•Ÿå‹•總線åŽçš„第1個å—節的高7使˜¯å°å¾žæ©Ÿçš„å°‹å€åœ°å€ï¼Œç¬¬8ä½ç‚ºæ–¹å‘ä½ï¼ˆâ€œ0â€è¡¨ç¤ºä¸»æ©Ÿå°å¾žæ©Ÿçš„寫æ“作;“1â€è¡¨ç¤ºä¸»æ©Ÿå°å¾žæ©Ÿçš„讀æ“作),其余的å—節為æ“作數據。數據傳é€éŽç¨‹æ˜¯ï¼šåœ¨I2C總線發é€èµ·å§‹ä¿¡è™ŸåŽï¼Œç™¼é€å¾žæ©Ÿçš„7ä½å°‹å€åœ°å€å’Œ1ä½è¡¨ç¤ºé€™æ¬¡æ“作性質的讀寫ä½ï¼Œåœ¨æœ‰æ‡‰ç”信號åŽé–‹å§‹å‚³é€æ•¸æ“šï¼Œç›´åˆ°ç™¼é€åœæ¢ä¿¡è™Ÿã€‚主機æ¯ç™¼é€1個å—ç¯€å°±è¦æª¢æ¸¬SDA線上有沒有收到應ç”信號,有則繼續發é€ï¼Œå¦å‰‡å°‡åœæ¢ç™¼é€æ•¸æ“šã€‚
2.Linuxä¸I2Cç¸½ç·šé©…å‹•çµæ§‹
Linux系統å°I2C總線具有很好的支æŒã€‚與硬件物ç†é€£æŽ¥ç›¸å°æ‡‰çš„,Linuxçš„I2C框架ä¸å„個部分的關系如圖1所示。
圖1 Linuxå…§æ ¸I2Cç¸½ç·šé©…å‹•ç¨‹åºæ§‹æž¶
å…§æ ¸ä¸I2C相關代碼å¯ä»¥åˆ†ç‚ºä¸‰å€‹å±¤æ¬¡ï¼š
1. I2C core框架:æä¾›äº†æ ¸å¿ƒæ•¸æ“šçµæ§‹çš„定義和相關接å£å‡½æ•¸ï¼Œç”¨ä¾†å¯¦ç¾I2Cé©é…器驅動和è¨å‚™é©…å‹•çš„æ³¨å†Šã€æ³¨éŠ·ç®¡ç†ï¼Œä»¥åŠI2C通信方法上層的ã€èˆ‡å…·é«”é©é…å™¨ç„¡é—œçš„ä»£ç¢¼ï¼Œç‚ºç³»çµ±ä¸æ¯å€‹I2Cç¸½ç·šå¢žåŠ ç›¸æ‡‰çš„è®€å¯«æ–¹æ³•ã€‚
2. I2C總線é©é…器驅動:定義æè¿°å…·é«”I2C總線é©é…器的i2c_adapteræ•¸æ“šçµæ§‹ã€å¯¦ç¾åœ¨å…·é«”I2Cé©é…器上的I2C總線通信方法,并由i2c_algorithmæ•¸æ“šçµæ§‹é€²è¡Œæè¿°ã€‚
3. I2C è¨å‚™é©…動:定義æè¿°å…·é«”è¨å‚™çš„i2c_clientå’Œå¯èƒ½çš„ç§æœ‰æ•¸æ“šçµæ§‹ã€å€ŸåŠ©I2C coreæä¾›çš„函數接å£å®Œæˆè¨å‚™åœ¨å…§æ ¸çš„æ³¨å†Šï¼Œå¹¶å¯¦ç¾å…·é«”的功能,包括read, write以åŠioctlç‰å°ç”¨æˆ¶å±¤æ“作的接å£ã€‚
總體而言,Linuxä¸I2C總線的驅動分為兩個部分:總線驅動(BUS)和è¨å‚™é©…動(DEVICE)。I2C core與I2C總線é©é…器驅動完æˆäº†ç¡¬ä»¶ä¸Šçš„主機總線驅動(BUS),而I2C driver則實ç¾äº†å¾žæ©Ÿè¨å‚™é©…動。在è¨è¨ˆä¸ï¼ŒI2C coreæä¾›çš„æŽ¥å£æ˜¯çµ±ä¸€çš„,ä¸éœ€è¦ä¿®æ”¹ï¼Œæˆ‘們åªéœ€è¦å¯¦ç¾ç‰¹å®šI2C總線é©é…器驅動和I2Cè¨å‚™é©…動,這樣大大æé«˜äº†ç³»çµ±çš„å¯ç§»æ¤æ€§ã€‚
ç†è€…在æŸå€‹ç”¢å“䏿›¾ç”¨AT91RM9200å’ŒX1227æ§‹æˆåµŒå…¥å¼ç³»çµ±çš„æ™‚é˜æ¨¡å¡Šã€‚在該è¨è¨ˆä¸ï¼ŒAT91RM9200作為I2C的主機部分,X1227作為從機。下é¢ä»¥æ¤ç‚ºä¾‹ï¼Œå…·é«”介紹這兩部分驅動的實ç¾ã€‚
3.AT91RM9200 I2C總線驅動實ç¾
AT91RM9200是ARM920T處ç†å™¨ï¼Œå®ƒæä¾›æ¨™æº–的兩線接å£TWI,å³I2C接å£ï¼Œä¸»æ©Ÿå·¥ä½œæ¨¡å¼ã€‚通éŽTWI 控制寄å˜å™¨TWI_CRè¨ç½®I2C工作模å¼å’Œç‹€æ…‹ã€‚時é˜ç”±å¯„å˜å™¨TWI_CWGRä¸ç·¨ç¨‹å€¼ç”¢ç”Ÿã€‚該寄å˜å™¨å®šç¾©äº†TWCK 信號,使接å£é©æ‡‰å¯¬èŒƒåœæ™‚é˜ã€‚
具體在linuxä¸AT91RM9200 I2C總線é©é…器驅動的實ç¾ï¼Œé¦–å…ˆåˆå§‹åŒ–AT91RM9200 I2C的工作模å¼ï¼Œç„¶åŽè£è¼‰I2C總線驅動,這需è¦å…©å€‹çµæ§‹æ¨¡å¡Šä¾†æè¿°ï¼šstruct i2c_adapterå’Œstruct i2c_algorithm。
åˆå§‹åŒ–i2c_adapterçµæ§‹æˆå“¡å¦‚下:
static struct i2c_adapter at91rm9200_adapter = ï½›
name: "AT91RM9200",
id: I2C_ALGO_SMBUS,
algo: &at91_algorithm,
algo_data: NULL,
inc_use:at91_inc,
dec_use:at91_dec,
... ...
ï½;
這個模塊并未æä¾›è®€å¯«å‡½æ•¸ï¼Œå…·é«”的讀寫方法由第二個模塊struct i2c_algorithmæä¾›ã€‚
static struct i2c_algorithm at91_algorithm = ï½›
name: "at91 i2c",
id: I2C_ALGO_SMBUS,
smbus_xfer: at91_smbus_xfer,
master_xfer: at91_xfer,
functionality: at91_func,
ï½;
通éŽèª¿ç”¨I2C coreä¸çš„æŽ¥å£å‡½æ•¸i2c_add_adapter將這兩個模塊注冊到æ“作系統里,總線驅動就算è£ä¸Šäº†ã€‚ç”±æ¤å¯è¦‹ï¼Œi2c_algorithm實ç¾äº†i2c通信具體方法。é‡å°æœ¬æ–‡at91rm9200 I2Cé©é…器, at91_xfer最為關éµã€‚分æžå…§æ ¸å¯çŸ¥ï¼ŒI2C coreæ¡†æž¶ä¸æä¾›çµ¦ä¸»æ©Ÿä½¿ç”¨çš„æ•¸æ“šå‚³è¼¸æŽ¥å£ï¼ši2c_master_send,i2c_master_recv,i2c_transfer最終都是通éŽèª¿ç”¨at91_xfer實ç¾ã€‚
數據傳輸處ç†å¦‚下:數據發é€ä¸»æ©Ÿåˆå§‹åŒ–Start狀態åŽï¼Œå‘主機模å¼å¯„å˜å™¨TWI_MMRä¸DADR發é€ä¸€å€‹7ä½å¾žæ©Ÿåœ°å€ï¼Œä»¥é€šçŸ¥å¾žæ©Ÿå™¨ä»¶ã€‚從機地å€åŽçš„ä½è¡¨ç¤ºå‚³è¼¸æ–¹å‘(寫或讀)。該ä½ç‚º0,說明是寫æ“ä½œï¼ˆç™¼é€æ“作);若該ä½ç‚º1,說明為數據讀請求( 接收æ“作)。TWI å‚³è¼¸è¦æ±‚å¾žæ©Ÿæ¯æ”¶åˆ°ä¸€å€‹å—節åŽå‡è¦çµ¦å‡ºæ‡‰ç”ã€‚åœ¨æ‡‰ç”æ™‚é˜è„ˆæ²–ä¸ï¼Œä¸»æ©Ÿé‡‹æ”¾æ•¸æ“šç·šï¼ˆHIGH),將從機拉低以產生應ç”。主機在該時é˜è„ˆæ²–ä¸è¼ªè©¢æ•¸æ“šç·šï¼Œå¯ä½¿ç”¨è¼ªè©¢æˆ–䏿–·æ–¹å¼ä¾†æª¢é©—狀態ä½ã€‚若從機未應ç”該å—節,將置ä½ç‹€æ…‹å¯„å˜å™¨TWI_SRçš„NAK ä½ã€‚
寫æ“ä½œå‰‡ç™¼é€æ•¸æ“šè‡³ä¿æŒå¯„å˜å™¨TWI_THR,è¨ç½®TWI_CRçš„START ä½ä»¥å•Ÿå‹•傳輸。數據在內部移ä½å¯„å˜å™¨ä¸ç§»ä½ï¼Œç•¶æª¢æ¸¬åˆ°æ‡‰ç”,TXRDYä½ç½®ä½ï¼Œç›´åˆ°TWI_THR䏿œ‰æ–°æ•¸æ“šå¯«å…¥ï¼Œæ‰æ¸…除該ä½ã€‚主機產生STOP ç‹€æ…‹ä¾†çµæŸå‚³è¼¸ã€‚è¨ç½®START åŽé–‹å§‹è®€åºåˆ—。當狀態寄å˜å™¨ä¸RXRDY ä½ç½®ä½æ™‚ï¼ŒæŽ¥æ”¶ä¿æŒå¯„å˜å™¨ï¼ˆTWI_RHR)以收到一個å—符。當讀TWI_RHR 時RXRDY ä½å¾©ä½ã€‚
TWI接å£å¯åŸ·è¡Œå¤šç¨®å‚³è¼¸æ ¼å¼ï¼š7ä½å¾žæ©Ÿåœ°å€å’Œ10ä½å¾žæ©Ÿåœ°å€ã€‚通éŽä¸»æ©Ÿæ¨¡å¼å¯„å˜å™¨TWI_MMRé…置三個內部地å€å—節。若從機僅支æŒ7 ä½åœ°å€ï¼ŒIADRSZ å¿…é ˆç½®ç‚º0。若從機地å€å¤§äºŽ7 ä½ï¼Œç”¨æˆ¶å¿…é ˆé…置地å€å¤§å°IADRSZ 并在內部地å€å¯„å˜å™¨TWI_IADRä¸è¨ç½®å…¶ä»–從機地å€ä½ã€‚
4.X1227çš„è¨å‚™é©…動實ç¾
X1227 是一個帶有時é˜ã€æ—¥æ·ã€CPU ç›£æŽ§é›»è·¯å’Œå…©è·¯æŸ¥è©¢å ±è¦çš„實時時é˜ã€‚時é˜ä½¿ç”¨ä¸€å€‹ä½Žæˆæœ¬çš„32.768kHz 的晶體作為輸入,å¯ç²¾å¯†åœ°ç”¨ç§’ã€åˆ†é˜ã€å°æ™‚ã€æ—¥æœŸã€æ˜ŸæœŸã€æœˆã€å¹´ä¾†é¡¯ç¤ºæ™‚間,它å¯ä»¥è‡ªå‹•調整é–年至2096å¹´ã€‚åŒæ™‚X1227有一個看門狗定時器ã€3個超時時間å¯ä¾›é¸æ“‡ã€‚å¦å¤–,X1227有一個4Kä½çš„EEPROM陣列,å¯ç”¨ä½œæŸäº›ç”¨æˆ¶é…置數據的å˜å„²å™¨ã€‚下é¢ä»¥X1227為例,說明一個具體的I2Cè¨å‚™é©…動程åºçš„è¨è¨ˆè¦é»žã€‚
如剿‰€è¿°ï¼ŒI2Cç¸½ç·šé©…å‹•åªæ˜¯æä¾›äº†å°ä¸€æ¢ç¸½ç·šçš„è®€å¯«æ©Ÿåˆ¶ï¼Œæœ¬èº«å¹¶ä¸æœƒåŽ»åšé€šä¿¡ã€‚通信是由I2Cè¨å‚™é©…動來åšçš„,è¨å‚™é©…å‹•é€éŽI2C總線åŒå…·é«”çš„è¨å‚™é€²è¡Œé€šè¨Šã€‚一個è¨å‚™é©…動有兩個模塊來æè¿°ï¼Œstruct i2c_clientå’Œstruct i2c_driver。i2c_client用來æè¿°ä¸€å€‹å…·é«”çš„I2Cè¨å‚™ï¼Œi2c_driverçµæ§‹æä¾›äº†i2c_adapter與i2c_client之間的通信方å¼ã€‚
struct i2c_driver x1227_driver = ï½›
name: 襒1227?
id: I2C_DRIVERID_X1227,
flags: I2C_DF_NOTIFY,
attach_adapter: x1227_probe,
detach_client: x1227_detach,
command: x1227_command
ï½;
å…¶ä¸ï¼šattach_adapter利用é©é…器驅動æä¾›çš„I2Cç¸½ç·šè¨ªå•æ–¹æ³•,利用è¨å‚™é©…å‹•ç¨‹åºæ¨¡å¡Šä¸æä¾›çš„地å€ç·šç´¢ä¿¡æ¯ï¼Œæª¢æ¸¬å¯èƒ½å˜åœ¨çš„è¨å‚™åŠå…¶åœ°å€ã€‚如果æˆåŠŸç™¼ç¾è¨å‚™ï¼Œå‰‡å‰µå»ºä¸€å€‹struct i2c_client來標è˜é€™å€‹è¨å‚™ï¼Œå¹¶å‘該é©é…å™¨çš„æ•¸æ“šçµæ§‹æ³¨å†Šã€‚detach_client用于從總線上注銷è¨å‚™ã€å¹¶é‡‹æ”¾i2c_clientåŠç›¸æ‡‰çš„ç§æœ‰æ•¸æ“šçµæ§‹ã€‚command是用戶接å£ä¸çš„ioctl功能的底層實ç¾ã€‚
I2Cè¨å‚™é©…動需è¦å¯¦ç¾å…©å€‹æ–¹é¢çš„æŽ¥å£ï¼Œä¸€å€‹æ˜¯å°I2C core框架的接å£ï¼Œè¨å‚™åˆå§‹åŒ–時通éŽå‡½æ•¸i2c_add_driver調用,來實ç¾é©…動的注冊。這個i2c_driver一旦è£å…¥å®Œæˆï¼Œå…¶ä¸çš„attach_adapter函數就會被調用。
å¦ä¸€å€‹æ˜¯å°ç”¨æˆ¶æ‡‰ç”¨å±¤çš„æŽ¥å£ï¼Œæä¾›ç”¨æˆ¶ç¨‹åºè¨ªå•I2Cè¨å‚™çš„æŽ¥å£ï¼ŒåŒ…括實ç¾open,release,read,writeä»¥åŠæœ€é‡è¦çš„ioctlç‰æ¨™æº–文件æ“作的接å£å‡½æ•¸ã€‚æ¯å€‹è¨å‚™é©…動程åºéƒ½æœ‰ä¸€å€‹ç¨±ç‚ºfile_operationsçš„æ•¸æ“šçµæ§‹ï¼Œç”¨ä¾†å¯¦ç¾æŽ¥å£å‡½æ•¸ã€‚
static struct file_operations rtc_fops = ï½›
owner: THIS_MODULE,
ioctl: x1227_rtc_ioctl,
open: x1227_rtc_open,
release: x1227_rtc_release,
ï½;
å…¶ä¸openå’Œrelease用來打開和關閉X1227,x1227_rtc_ioctl則å‘用戶æä¾›çš„一系列控制時é˜èŠ¯ç‰‡çš„å…·é«”å‘½ä»¤ï¼šRTC_GET_TIMEï¼ˆä»¥å›ºå®šçš„æ•¸æ“šæ ¼å¼è®€å–實時時é˜çš„æ™‚間)ã€RTC_SET_TIMEï¼ˆä»¥å›ºå®šçš„æ•¸æ“šæ ¼å¼è¨å®šå¯¦æ™‚時é˜çš„æ™‚間)以åŠE2PROM讀寫ç‰ã€‚
å°äºŽX1227,一般注冊為一個miscdeviceè¨å‚™ï¼ˆæ‰€æœ‰miscdeviceè¨å‚™å…±åŒä¸€å€‹ä¸»è¨å‚™è™Ÿï¼Œä¸åŒçš„æ¬¡è¨å‚™è™Ÿï¼‰ã€‚
static struct miscdevice x1227_rtc_miscdev = ï½›
RTC_MINOR,
tc?
&rtc_fops
ï½;
åˆå§‹åŒ–時,通éŽmisc_register (&x1227_rtc_miscdev)注冊X1227,這樣用戶程åºå¯ä»¥é€šéŽä¸»è¨å‚™è™Ÿ10 次è¨å‚™è™Ÿ 135çš„è¨å‚™ç¯€é»ž/dev/rtc來訪å•X1227。
è¦æ¸¬è©¦X1227的時é˜åŠŸèƒ½ï¼Œé¦–å…ˆæŠŠAT91RM9200çš„I2C總線驅動模塊和X1227模塊在系統啟動時先åŽåŠ è¼‰ã€‚éœ€è¦æŒ‡å‡ºçš„æ˜¯ï¼ŒLinux將時é˜åˆ†ç‚ºç³»çµ±æ™‚é˜å’Œç¡¬ä»¶æ™‚é˜å…©ç¨®ã€‚ç³»çµ±æ™‚é˜æ˜¯æŒ‡ç•¶å‰Linux Kernelä¸çš„æ™‚é˜ï¼Œè€Œç¡¬ä»¶æ™‚é˜å‰‡æ˜¯ä¸»æ¿ä¸Šç”±é›»æ± 供電的那個主æ¿ç¡¬ä»¶æ™‚é˜ï¼Œä¹Ÿå°±æ˜¯æœ¬æ–‡ä¸çš„X1227。
在Linuxä¸ï¼Œç”¨äºŽæ™‚é˜æŸ¥çœ‹å’Œè¨ç½®çš„å‘½ä»¤ä¸»è¦æœ‰dateã€hwclock。首先è¨ç½®ç³»çµ±æ™‚é˜ï¼Œæ¯”如è¨ç½®ç‚º2006å¹´8月17æ—¥12點30分:date 081712302006,然åŽè¨ç½®ç¡¬ä»¶æ™‚é˜ç‚ºç•¶å‰ç³»çµ±æ™‚é˜æ™‚間,使用命令/sbin/hwclock è¡§ystohc,則X1227ä¸çš„æ™‚é–“è¨ç½®ç‚ºç•¶å‰ç³»çµ±æ™‚間。然åŽï¼Œé€šå¸¸åœ¨æ“作系統啟動時è¨ç½®å•Ÿå‹•腳本/sbin/hwclock è¡•ctosys,利用X1227內的時間更新系統時é˜ï¼Œç„¶åŽç›´åˆ°é‡å•Ÿæˆ–關閉系統,由系統時é˜ä¾†è¨˜éŒ„時間。
5.çµèªž
本文介紹了I2C總線é©é…器åŠI2Cè¨å‚™é©…動的實ç¾ã€‚該è¨è¨ˆæˆåŠŸç”¨äºŽæŸç¶²çµ¡æ¸¬è©¦è¨å‚™çš„主控模塊上,實ç¾äº†è¨å‚™çš„實時時é˜åŠŸèƒ½ï¼Œä¾¿äºŽæ•´å€‹ç³»çµ±çš„ç›£æŽ§ã€‚I2C總線在目å‰çš„嵌入å¼é ˜åŸŸä¸æ‡‰ç”¨éžå¸¸å»£æ³›ï¼Œå¦‚音/è¦–é »çš„æŽ§åˆ¶ï¼Œå˜å„²è¨å‚™çš„通訊ç‰ï¼Œè€ŒLinux也已æˆç‚ºåµŒå…¥å¼ç³»çµ±çš„主æµã€‚從linuxå…§æ ¸çœ‹ï¼ŒI2C的驅動程åºå…·æœ‰æ¸…æ™°çš„å±¤æ¬¡çµæ§‹ï¼Œç‚ºç·¨ç¨‹è€…開發I2C相關驅動æä¾›äº†è¦èŒƒçš„æ¡†æž¶ã€‚