/*
 * Copyright (c) 2021 Max Thomas
 * This file is part of DSiWifi and is distributed under the MIT license.
 * See dsiwifi_license.txt for terms of use.
 */

#ifndef _DSIWIFI_UTILS_H
#define _DSIWIFI_UTILS_H

#include "common.h"

#define round_up(x, n) ( ((x) + (n)-1)  & (~((n)-1)) ) 

static inline void ioDelay(u32 count)
{
  int i;
  for (i = 0; i < count; i++)
      __asm__ volatile ("");
}

static inline u32 getle32(const void *p)
{
    const u8 *cp = p;

    return (u32)cp[0] + ((u32)cp[1] << 8) +
        ((u32)cp[2] << 16) + ((u32)cp[3] << 24);
}

static inline u64 getle64(const u8* p)
{
    u64 n = p[0];

    n |= (u64)p[1] << 8;
    n |= (u64)p[2] << 16;
    n |= (u64)p[3] << 24;
    n |= (u64)p[4] << 32;
    n |= (u64)p[5] << 40;
    n |= (u64)p[6] << 48;
    n |= (u64)p[7] << 56;
    return n;
}

static inline u64 getbe64(const u8* p)
{
    u64 n = 0;

    n |= (u64)p[0] << 56;
    n |= (u64)p[1] << 48;
    n |= (u64)p[2] << 40;
    n |= (u64)p[3] << 32;
    n |= (u64)p[4] << 24;
    n |= (u64)p[5] << 16;
    n |= (u64)p[6] << 8;
    n |= (u64)p[7] << 0;
    return n;
}

static inline u32 getbe32(const u8* p)
{
    return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | (p[3] << 0);
}

static inline u32 getle16(const u8* p)
{
    return (p[0] << 0) | (p[1] << 8);
}

static inline u32 getbe16(const u8* p)
{
    return (p[0] << 8) | (p[1] << 0);
}

static inline void putle16(u8* p, u16 n)
{
    p[0] = n;
    p[1] = n >> 8;
}

static inline void putbe16(u8* p, u16 n)
{
    p[0] = n >> 8;
    p[1] = n;
}

static inline void putle32(u8* p, u32 n)
{
    p[0] = n;
    p[1] = n >> 8;
    p[2] = n >> 16;
    p[3] = n >> 24;
}

static inline void putbe64(u8* p, u64 n)
{
    p[0] = n >> 56;
    p[1] = n >> 48;
    p[2] = n >> 40;
    p[3] = n >> 32;
    p[4] = n >> 24;
    p[5] = n >> 16;
    p[6] = n >> 8;
    p[7] = n >> 0;
}

void hexdump(const void* data, size_t size);

#endif // _DSIWIFI_UTILS_H