source: rtems/c/src/lib/libbsp/arm/edb7312/network/network.c @ 0af8bb6

5
Last change on this file since 0af8bb6 was 0af8bb6, checked in by Sebastian Huber <sebastian.huber@…>, on 06/12/17 at 13:40:37

bsp: Include missing <sys/param.h>

Update #2833.

  • Property mode set to 100644
File size: 3.1 KB
Line 
1#include <rtems.h>
2#include <sys/param.h>
3#include <sys/mbuf.h>
4#include <bsp/irq.h>
5#include <libchip/cs8900.h>
6#include <assert.h>
7
8#define CS8900_BASE 0x20000300
9unsigned int bsp_cs8900_io_base = 0;
10unsigned int bsp_cs8900_memory_base = 0;
11static void cs8900_isr(void *);
12
13char g_enetbuf[1520];
14
15static void cs8900_isr(void *arg)
16{
17    cs8900_interrupt(BSP_EINT3, arg);
18}
19
20/* cs8900_io_set_reg - set one of the I/O addressed registers */
21void cs8900_io_set_reg (cs8900_device *cs, unsigned short reg, unsigned short data)
22{
23    /* works the same for all values of dev */
24/*
25    printf("cs8900_io_set_reg: reg: %#6x, val %#6x\n",
26           CS8900_BASE + reg,
27           data);
28*/
29   *(unsigned short *)(CS8900_BASE + reg) = data;
30}
31
32/* cs8900_io_get_reg - reads one of the I/O addressed registers */
33unsigned short cs8900_io_get_reg (cs8900_device *cs, unsigned short reg)
34{
35    unsigned short val;
36    /* works the same for all values of dev */
37    val = *(unsigned short *)(CS8900_BASE + reg);
38/*
39    printf("cs8900_io_get_reg: reg: %#6x, val %#6x\n", reg, val);
40*/
41    return val;
42}
43
44/* cs8900_mem_set_reg - sets one of the registers mapped through
45 *                      PacketPage
46 */
47void cs8900_mem_set_reg (cs8900_device *cs, unsigned long reg, unsigned short data)
48{
49    /* works the same for all values of dev */
50    cs8900_io_set_reg(cs, CS8900_IO_PACKET_PAGE_PTR, reg);
51    cs8900_io_set_reg(cs, CS8900_IO_PP_DATA_PORT0, data);
52}
53
54/* cs8900_mem_get_reg - reads one of the registers mapped through
55 *                      PacketPage
56 */
57unsigned short cs8900_mem_get_reg (cs8900_device *cs, unsigned long reg)
58{
59    /* works the same for all values of dev */
60    cs8900_io_set_reg(cs, CS8900_IO_PACKET_PAGE_PTR, reg);
61    return cs8900_io_get_reg(cs, CS8900_IO_PP_DATA_PORT0);
62}
63
64void cs8900_attach_interrupt (cs8900_device *cs)
65{
66    rtems_status_code status = RTEMS_SUCCESSFUL;
67
68    status = rtems_interrupt_handler_install(
69        BSP_EINT3,
70        "Network",
71        RTEMS_INTERRUPT_UNIQUE,
72        cs8900_isr,
73        cs
74    );
75    assert(status == RTEMS_SUCCESSFUL);
76}
77
78void cs8900_detach_interrupt (cs8900_device *cs)
79{
80    rtems_status_code status = RTEMS_SUCCESSFUL;
81
82    status = rtems_interrupt_handler_remove(
83        BSP_EINT3,
84        cs8900_isr,
85        cs
86    );
87    assert(status == RTEMS_SUCCESSFUL);
88}
89
90unsigned short cs8900_get_data_block (cs8900_device *cs, unsigned char *data)
91{
92    int len;
93    int i;
94
95    len = cs8900_mem_get_reg(cs, CS8900_PP_RxLength);
96
97    for (i = 0; i < ((len + 1) / 2); i++) {
98        ((short *)data)[i] = cs8900_io_get_reg(cs,
99                                               CS8900_IO_RX_TX_DATA_PORT0);
100    }
101    return len;
102}
103
104void cs8900_tx_load (cs8900_device *cs, struct mbuf *m)
105{
106    int len;
107    unsigned short *data;
108    int i;
109
110    len = 0;
111
112    do {
113        memcpy(&g_enetbuf[len], mtod(m, const void *), m->m_len);
114        len += m->m_len;
115        m = m->m_next;
116    } while (m != 0);
117
118    data = (unsigned short *) &g_enetbuf[0];
119    for (i = 0; i < ((len + 1) / 2); i++) {
120        cs8900_io_set_reg(cs,
121                          CS8900_IO_RX_TX_DATA_PORT0,
122                          data[i]);
123    }
124}
Note: See TracBrowser for help on using the repository browser.