17 #include "stm32f7xx_hal_conf.h" 18 #include "stm32f7xx_hal_eth.h" 25 #define LAN8742A_PHY_ADDRESS 0x00U 27 #define RMII_TXD1_Pin GPIO_PIN_14 28 #define RMII_TXD1_GPIO_Port GPIOG 29 #define RMII_TXD0_Pin GPIO_PIN_13 30 #define RMII_TXD0_GPIO_Port GPIOG 31 #define RMII_TX_EN_Pin GPIO_PIN_11 32 #define RMII_TX_EN_GPIO_Port GPIOG 33 #define RMII_RXER_Pin GPIO_PIN_5 34 #define RMII_RXER_GPIO_Port GPIOD 35 #define RMII_MDC_Pin GPIO_PIN_1 36 #define RMII_MDC_GPIO_Port GPIOC 37 #define RMII_REF_CLK_Pin GPIO_PIN_1 38 #define RMII_REF_CLK_GPIO_Port GPIOA 39 #define RMII_RXD0_Pin GPIO_PIN_4 40 #define RMII_RXD0_GPIO_Port GPIOC 41 #define RMII_MDIO_Pin GPIO_PIN_2 42 #define RMII_MDIO_GPIO_Port GPIOA 43 #define RMII_RXD1_Pin GPIO_PIN_5 44 #define RMII_RXD1_GPIO_Port GPIOC 45 #define RMII_CRS_DV_Pin GPIO_PIN_7 46 #define RMII_CRS_DV_GPIO_Port GPIOA 48 #ifndef GSC_ETHERDEV_DEFAULT_MACADDRESS // $gsc EtherデバイスデフォルトMACアドレス 49 static unsigned char macaddress[6] = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x01 };
51 static unsigned char macaddress[6] = {
52 (GSC_ETHERDEV_DEFAULT_MACADDRESS >> 40) & 0xff,
53 (GSC_ETHERDEV_DEFAULT_MACADDRESS >> 32) & 0xff,
54 (GSC_ETHERDEV_DEFAULT_MACADDRESS >> 24) & 0xff,
55 (GSC_ETHERDEV_DEFAULT_MACADDRESS >> 16) & 0xff,
56 (GSC_ETHERDEV_DEFAULT_MACADDRESS >> 8) & 0xff,
57 (GSC_ETHERDEV_DEFAULT_MACADDRESS >> 0) & 0xff
60 static unsigned char ether_event[ETH_RXBUFNB + 1];
61 static struct st_event interrupt_evtque;
62 static ETH_HandleTypeDef EthHandle;
65 ETH_DMADescTypeDef DMARxDscrTab[ETH_RXBUFNB] __attribute__((section(
".RxDescripSection")));
66 ETH_DMADescTypeDef DMATxDscrTab[ETH_TXBUFNB] __attribute__((section(
".TxDescripSection")));
67 uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE] __attribute__((section(
".RxBUF")));
68 uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE] __attribute__((section(
".TxBUF")));
70 void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
75 static void inthdr_ether(
unsigned int intnum,
void *sp)
77 DKFPRINTF(0x01,
"\n");
81 HAL_ETH_IRQHandler(&EthHandle);
84 void HAL_ETH_MspInit(ETH_HandleTypeDef* heth)
86 DKFPRINTF(0x01,
"\n");
88 GPIO_InitTypeDef GPIO_InitStruct;
89 if(heth->Instance==ETH) {
90 __HAL_RCC_GPIOA_CLK_ENABLE();
91 __HAL_RCC_GPIOC_CLK_ENABLE();
92 __HAL_RCC_GPIOG_CLK_ENABLE();
93 __HAL_RCC_ETH_CLK_ENABLE();
94 GPIO_InitStruct.Pin = RMII_TXD1_Pin|RMII_TXD0_Pin|RMII_TX_EN_Pin;
95 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
96 GPIO_InitStruct.Pull = GPIO_NOPULL;
97 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
98 GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
99 HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
101 GPIO_InitStruct.Pin = RMII_MDC_Pin|RMII_RXD0_Pin|RMII_RXD1_Pin;
102 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
103 GPIO_InitStruct.Pull = GPIO_NOPULL;
104 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
105 GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
106 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
108 GPIO_InitStruct.Pin = RMII_REF_CLK_Pin|RMII_MDIO_Pin|RMII_CRS_DV_Pin;
109 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
110 GPIO_InitStruct.Pull = GPIO_NOPULL;
111 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
112 GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
113 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
117 static int ether_register(
struct st_device *dev,
char *param)
120 ether_event,
sizeof(
unsigned char), ETH_RXBUFNB + 1);
122 register_interrupt(IRQ2VECT(ETH_IRQn), inthdr_ether);
124 EthHandle.Instance = ETH;
125 EthHandle.Init.MACAddr = macaddress;
126 EthHandle.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
127 EthHandle.Init.Speed = ETH_SPEED_100M;
128 EthHandle.Init.DuplexMode = ETH_MODE_FULLDUPLEX;
129 EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;
130 EthHandle.Init.RxMode = ETH_RXINTERRUPT_MODE;
131 #ifdef GSC_ETHERDEV_HARDWARE_CHECKSUM // $gsc Etherデバイスのハードウェアチェックサムを有効にする 132 EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;
134 EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_SOFTWARE;
136 EthHandle.Init.PhyAddress = LAN8742A_PHY_ADDRESS;
139 if(HAL_ETH_Init(&EthHandle) == HAL_OK) {
144 HAL_ETH_DMATxDescListInit(&EthHandle, DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
147 HAL_ETH_DMARxDescListInit(&EthHandle, DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
152 static int ether_open(
struct st_device *dev)
154 DKFPRINTF(0x01,
"\n");
156 HAL_NVIC_SetPriority(ETH_IRQn, 0, 0);
157 HAL_NVIC_EnableIRQ(ETH_IRQn);
159 HAL_ETH_Start(&EthHandle);
164 static int ether_close(
struct st_device *dev)
166 DKFPRINTF(0x01,
"\n");
168 HAL_ETH_Stop(&EthHandle);
173 static int ether_read(
struct st_device *dev,
void *data,
unsigned int size)
175 DKFPRINTF(0x01,
"size = %d\n", size);
178 unsigned short len = 0;
179 unsigned char *buffer;
180 volatile ETH_DMADescTypeDef *dmarxdesc;
182 if(HAL_ETH_GetReceivedFrame_IT(&EthHandle) != HAL_OK) {
183 DKPRINTF(0x01,
"ETH Receive Error?\n");
186 DKPRINTF(0x01,
"ETH Receive OK\n");
189 DKPRINTF(0x01,
"SegCount = %d\n", (
int)EthHandle.RxFrameInfos.SegCount);
190 DKPRINTF(0x01,
"RxFrameInfos.buffer = %08X\n", (
unsigned int)EthHandle.RxFrameInfos.buffer);
193 len = EthHandle.RxFrameInfos.length;
194 buffer = (uint8_t *)EthHandle.RxFrameInfos.buffer;
200 dmarxdesc = EthHandle.RxFrameInfos.FSRxDesc;
202 for(i=0; i< EthHandle.RxFrameInfos.SegCount; i++) {
203 dmarxdesc->Status |= ETH_DMARXDESC_OWN;
204 dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);
208 EthHandle.RxFrameInfos.SegCount = 0;
211 if((EthHandle.Instance->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) {
213 EthHandle.Instance->DMASR = ETH_DMASR_RBUS;
215 EthHandle.Instance->DMARPDR = 0;
222 static int ether_write(
struct st_device *dev,
const void *data,
unsigned int size)
224 DKFPRINTF(0x01,
"size = %d\n", size);
226 unsigned char *buffer = (
unsigned char *)(EthHandle.TxDesc->Buffer1Addr);
232 HAL_ETH_TransmitFrame(&EthHandle, size);
235 if((EthHandle.Instance->DMASR & ETH_DMASR_TUS) != (uint32_t)RESET) {
237 EthHandle.Instance->DMASR = ETH_DMASR_TUS;
240 EthHandle.Instance->DMATPDR = 0;
246 static int ether_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
248 DKFPRINTF(0x01,
"com = %ld arg = %ld\n", com, arg);
253 unsigned char *mac = (
unsigned char *)param;
257 mac[i] = macaddress[i];
260 DKPRINTF(0x01,
"MAC Addr %02X:%02X:%02X:%02X:%02X:%02X\n",
261 (
int)mac[0], (
int)mac[1], (
int)mac[2],
262 (
int)mac[3], (
int)mac[4], (
int)mac[5]);
274 HAL_ETH_Start(&EthHandle);
278 HAL_ETH_Stop(&EthHandle);
283 unsigned long phyreg;
286 HAL_ETH_ReadPHYRegister(&EthHandle, PHY_BSR, &phyreg);
287 DKPRINTF(0x01,
"PHY_BSR = %08X\n", phyreg);
289 switch(phyreg & PHY_FULLDUPLEX_100M) {
290 case PHY_FULLDUPLEX_100M:
295 case PHY_HALFDUPLEX_100M:
299 case PHY_FULLDUPLEX_10M:
303 case PHY_HALFDUPLEX_10M:
310 if((phyreg & PHY_LINKED_STATUS) != 0) {
319 SYSERR_PRINT(
"Unknow command %08lX arg %08lX\n", com, arg);
326 static int ether_select(
struct st_device *dev,
unsigned int timeout)
328 DKFPRINTF(0x01,
"timeout = %d\n", timeout);
332 rtn =
event_wait(&interrupt_evtque, 0, timeout);
334 DKPRINTF(0x01,
"%s return=%ld\n", __FUNCTION__, rtn);
342 .explan =
"STM32F7xxx-Discovery Ether",
343 .register_dev = ether_register,
345 .close = ether_close,
347 .write = ether_write,
348 .ioctl = ether_ioctl,
349 .select = ether_select,
#define IOCMD_ETHER_CLEAR_BUF
バッファをクリアする
#define IOCMD_ETHER_GET_LINK_STATUS
リンク状態を取得する
#define IOCMD_ETHER_SET_MACADDR
MACアドレスを設定する
#define IORTN_BIT_ETHER_LINK_UP
リンクアップ状態
void eventqueue_register(struct st_event *evtque, const char *name, void *args, unsigned int size, int count)
イベントキューを登録する
#define DEF_DEV_NAME_ETHER
標準Etherデバイス名
void event_wakeup_ISR(void *sp, struct st_event *evtque, void *arg)
イベントキューにイベントを登録し、イベント待ちタスクを起動する
#define IORTN_BIT_ETHER_FULLDUPLEX
全二重状態
#define IOCMD_ETHER_LINK_DOWN
リンクダウンする
void * memorycopy(void *dest, const void *src, unsigned int count)
メモリコピー
#define IOCMD_ETHER_GET_MACADDR
MACアドレスを取得する
#define IORTN_BIT_ETHER_100M
通信速度100Mbps
#define IOCMD_ETHER_LINK_UP
リンクアップする
char name[MAX_DEVNAMELRN]
デバイス名文字列
unsigned int size
1イベントのサイズ
int event_wait(struct st_event *evtque, void *argp, unsigned int timeout)
タスクをイベント待ち状態にする