Revision c580d92b hw/nseries.c

b/hw/nseries.c
50 50
    struct tusb_s *usb;
51 51
    void *retu;
52 52
    void *tahvo;
53
    void *nand;
53 54
};
54 55

  
55 56
/* GPIO pins */
......
101 102
#define N8X0_TMP105_GPIO		125
102 103

  
103 104
/* Config */
105
#define BT_UART				0
104 106
#define XLDR_LL_UART			1
105 107

  
106 108
/* Addresses on the I2C bus 0 */
......
118 120
#define N8X0_USB_ASYNC_CS		1
119 121
#define N8X0_USB_SYNC_CS		4
120 122

  
123
#define N8X0_BD_ADDR			0x00, 0x1a, 0x89, 0x9e, 0x3e, 0x81
124

  
125
typedef struct {
126
    uint8_t b[6];
127
} __attribute__((packed)) bdaddr_t;	/* XXX: move to BT headers */
128

  
121 129
static void n800_mmc_cs_cb(void *opaque, int line, int level)
122 130
{
123 131
    /* TODO: this seems to actually be connected to the menelaus, to
......
135 143
    qemu_irq_lower(omap2_gpio_in_get(s->cpu->gpif, N800_BAT_COVER_GPIO)[0]);
136 144
}
137 145

  
146
#define MAEMO_CAL_HEADER(...)				\
147
    'C',  'o',  'n',  'F',  0x02, 0x00, 0x04, 0x00,	\
148
    __VA_ARGS__,					\
149
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150

  
151
static const uint8_t n8x0_cal_wlan_mac[] = {
152
    MAEMO_CAL_HEADER('w', 'l', 'a', 'n', '-', 'm', 'a', 'c')
153
    0x1c, 0x00, 0x00, 0x00, 0x47, 0xd6, 0x69, 0xb3,
154
    0x30, 0x08, 0xa0, 0x83, 0x00, 0x00, 0x00, 0x00,
155
    0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
156
    0x89, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00,
157
    0x5d, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00,
158
};
159

  
160
static const uint8_t n8x0_cal_bt_id[] = {
161
    MAEMO_CAL_HEADER('b', 't', '-', 'i', 'd', 0, 0, 0)
162
    0x0a, 0x00, 0x00, 0x00, 0xa3, 0x4b, 0xf6, 0x96,
163
    0xa8, 0xeb, 0xb2, 0x41, 0x00, 0x00, 0x00, 0x00,
164
    N8X0_BD_ADDR,
165
};
166

  
138 167
static void n8x0_nand_setup(struct n800_s *s)
139 168
{
169
    char *otp_region;
170

  
140 171
    /* Either ec40xx or ec48xx are OK for the ID */
141 172
    omap_gpmc_attach(s->cpu->gpmc, N8X0_ONENAND_CS, 0, onenand_base_update,
142 173
                    onenand_base_unmap,
143
                    onenand_init(0xec4800, 1,
144
                            omap2_gpio_in_get(s->cpu->gpif,
145
                                    N8X0_ONENAND_GPIO)[0]));
174
                    (s->nand = onenand_init(0xec4800, 1,
175
                                            omap2_gpio_in_get(s->cpu->gpif,
176
                                                    N8X0_ONENAND_GPIO)[0])));
177
    otp_region = onenand_raw_otp(s->nand);
178

  
179
    memcpy(otp_region + 0x000, n8x0_cal_wlan_mac, sizeof(n8x0_cal_wlan_mac));
180
    memcpy(otp_region + 0x800, n8x0_cal_bt_id, sizeof(n8x0_cal_bt_id));
181
    /* XXX: in theory should also update the OOB for both pages */
146 182
}
147 183

  
148 184
static void n8x0_i2c_setup(struct n800_s *s)
......
1048 1084
    { 0, 0, 0, 0 }
1049 1085
};
1050 1086

  
1087
static bdaddr_t n8x0_bd_addr = {{ N8X0_BD_ADDR }};
1088

  
1051 1089
static int n8x0_atag_setup(void *p, int model)
1052 1090
{
1053 1091
    uint8_t *b;
......
1067 1105
#if 0
1068 1106
    stw_raw(w ++, OMAP_TAG_SERIAL_CONSOLE);	/* u16 tag */
1069 1107
    stw_raw(w ++, 4);				/* u16 len */
1070
    stw_raw(w ++, XLDR_LL_UART);		/* u8 console_uart */
1108
    stw_raw(w ++, XLDR_LL_UART + 1);		/* u8 console_uart */
1071 1109
    stw_raw(w ++, 115200);			/* u32 console_speed */
1072 1110
#endif
1073 1111

  
......
1111 1149
    stb_raw(b ++, N8X0_BT_WKUP_GPIO);		/* u8 bt_wakeup_gpio */
1112 1150
    stb_raw(b ++, N8X0_BT_HOST_WKUP_GPIO);	/* u8 host_wakeup_gpio */
1113 1151
    stb_raw(b ++, N8X0_BT_RESET_GPIO);		/* u8 reset_gpio */
1114
    stb_raw(b ++, 1);				/* u8 bt_uart */
1115
    memset(b, 0, 6);				/* u8 bd_addr[6] */
1152
    stb_raw(b ++, BT_UART + 1);			/* u8 bt_uart */
1153
    memcpy(b, &n8x0_bd_addr, 6);		/* u8 bd_addr[6] */
1116 1154
    b += 6;
1117 1155
    stb_raw(b ++, 0x02);			/* u8 bt_sysclk (38.4) */
1118 1156
    w = (void *) b;

Also available in: Unified diff