source: ReferenceDesigns/w3_802.11/c/wlan_w3_high/w3_sw_intr.c

Last change on this file was 6319, checked in by chunter, 5 years ago

1.8.0 release wlan-mac-se

File size: 1.9 KB
Line 
1/*****************************************************************
2* File: w3_sw_intr.c
3* Copyright (c) 2019 Mango Communications, all rights reserved
4*****************************************************************/
5
6#include "wlan_platform_high.h"
7#include "wlan_mac_high.h"
8#include "w3_sw_intr.h"
9#include "sw_intr_util.h"
10#include "xparameters.h"
11
12// Base address of sw_intr_util pcore for software-generated interrupts
13#define SW_INTR_BASEADDR    XPAR_HIGH_SW_INTR_UTIL_BASEADDR
14
15void _sw_intr_A_handler();
16
17int w3_sw_intr_init() {
18    sw_intr_init(SW_INTR_BASEADDR);
19
20    // Configure sw_intr_A to assert for one-hot interrupt IDs
21    sw_intr_set_mask_A0(SW_INTR_BASEADDR, (SW_INTR_ID_PORTAL_ETH_RX | SW_INTR_ID_PORTAL_ETH_TX | SW_INTR_ID_WLAN_EXP_ETH_TX));
22
23    // Connect the ISR - sw_intr_util outputs are low after sw_intr_init()
24    //  Core has two interrupt outputs
25    //  W3 project connects INTRA to high priority, INTRB to low-priority
26    wlan_platform_interrupt_connect(XPAR_INTC_0_SW_INTR_UTIL_0_INTRA_OUT_VEC_ID, (wlan_intr_handler_t)_sw_intr_A_handler, NULL);
27    wlan_platform_interrupt_enable(XPAR_INTC_0_SW_INTR_UTIL_0_INTRA_OUT_VEC_ID);
28
29    return WLAN_SUCCESS;
30}
31
32void wlan_platform_assert_sw_intr(u32 intr_mask) {
33    u32 x = sw_intr_get_state0(SW_INTR_BASEADDR);
34
35    sw_intr_set_state0(SW_INTR_BASEADDR, x | intr_mask);
36}
37void wlan_platform_clear_sw_intr(u32 intr_mask) {
38    u32 x = sw_intr_get_state0(SW_INTR_BASEADDR);
39
40    sw_intr_set_state0(SW_INTR_BASEADDR, x & ~intr_mask);
41}
42
43void wlan_platform_set_sw_intr_mask(u32 intr_mask) {
44    sw_intr_set_mask_A0(SW_INTR_BASEADDR, sw_intr_get_mask_A0(SW_INTR_BASEADDR)|intr_mask);
45}
46
47void wlan_platform_clear_sw_intr_mask(u32 intr_mask) {
48    sw_intr_set_mask_A0(SW_INTR_BASEADDR, sw_intr_get_mask_A0(SW_INTR_BASEADDR)&~intr_mask);
49}
50
51// Local functions
52void _sw_intr_A_handler(void *InstancePtr) {
53    // InstancePtr is NULL for sw_intr_util interrupts
54    u32 intr_state = sw_intr_get_state0(SW_INTR_BASEADDR);
55
56    wlan_mac_high_sw_intr_callback(intr_state);
57}
Note: See TracBrowser for help on using the repository browser.