1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/include/utils.h Fri Nov 09 21:03:47 2018 +0100
1.3 @@ -0,0 +1,31 @@
1.4 +/*
1.5 + * Some simple utility functions.
1.6 + *
1.7 + * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk>
1.8 + *
1.9 + * This program is free software: you can redistribute it and/or modify
1.10 + * it under the terms of the GNU General Public License as published by
1.11 + * the Free Software Foundation, either version 3 of the License, or
1.12 + * (at your option) any later version.
1.13 + *
1.14 + * This program is distributed in the hope that it will be useful,
1.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.17 + * GNU General Public License for more details.
1.18 + *
1.19 + * You should have received a copy of the GNU General Public License
1.20 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
1.21 + */
1.22 +
1.23 +#ifndef __UTILS_H__
1.24 +#define __UTILS_H__
1.25 +
1.26 +#include <stdint.h>
1.27 +
1.28 +void wait(uint32_t delay);
1.29 +
1.30 +uint8_t *wrap_pointer(uint8_t *ptr, uint8_t *lower, uint8_t *upper);
1.31 +
1.32 +int wrap_value(int value, int limit);
1.33 +
1.34 +#endif /* __UTILS_H__ */
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/lib/utils.c Fri Nov 09 21:03:47 2018 +0100
2.3 @@ -0,0 +1,58 @@
2.4 +/*
2.5 + * Some simple utility functions.
2.6 + *
2.7 + * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk>
2.8 + *
2.9 + * This program is free software: you can redistribute it and/or modify
2.10 + * it under the terms of the GNU General Public License as published by
2.11 + * the Free Software Foundation, either version 3 of the License, or
2.12 + * (at your option) any later version.
2.13 + *
2.14 + * This program is distributed in the hope that it will be useful,
2.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2.17 + * GNU General Public License for more details.
2.18 + *
2.19 + * You should have received a copy of the GNU General Public License
2.20 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
2.21 + */
2.22 +
2.23 +#include "utils.h"
2.24 +
2.25 +
2.26 +
2.27 +/* A simple busy wait involving a register-based counter. */
2.28 +
2.29 +void wait(uint32_t delay)
2.30 +{
2.31 + uint32_t counter = delay;
2.32 +
2.33 + if (!delay) return;
2.34 + while (counter--) __asm__(""); /* retain loop */
2.35 +}
2.36 +
2.37 +/* Wrap a pointer within the given limits. */
2.38 +
2.39 +uint8_t *wrap_pointer(uint8_t *ptr, uint8_t *lower, uint8_t *upper)
2.40 +{
2.41 + uint32_t size = upper - lower;
2.42 +
2.43 + if (ptr < lower)
2.44 + return upper - (lower - ptr) % size;
2.45 + else if (ptr >= upper)
2.46 + return lower + (ptr - upper) % size;
2.47 + else
2.48 + return ptr;
2.49 +}
2.50 +
2.51 +/* Wrap a value within the bounds [0, limit). */
2.52 +
2.53 +int wrap_value(int value, int limit)
2.54 +{
2.55 + if (value < 0)
2.56 + return limit - (-value % limit);
2.57 + else if (value >= limit)
2.58 + return (value - limit) % limit;
2.59 + else
2.60 + return value;
2.61 +}