12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- /*
- * @file hv_drv_UsbBitWise.h
- * @brief Header file of usb module.
- *
- * @author HiView SoC Software Team
- * @version 1.0.0
- * @date 2022-06-15
- */
- #ifndef __HV_DRV_USB_BITWISE_H
- #define __HV_DRV_USB_BITWISE_H
- #include "hv_drv_UsbPortingTypes.h"
- #define __BITS_PER_LONG 32
- #define BITOP_WORD(nr) (nr / __BITS_PER_LONG)
- INLINE void set_bit(int nr, volatile unsigned long *addr) {
- addr[nr / __BITS_PER_LONG] |= 1UL << (nr % __BITS_PER_LONG);
- }
- INLINE void clear_bit(int nr, volatile unsigned long *addr) {
- addr[nr / __BITS_PER_LONG] &= ~(1UL << (nr % __BITS_PER_LONG));
- }
- INLINE int test_bit(int nr, const unsigned long *addr) {
- return ((1UL << (nr % __BITS_PER_LONG)) & (addr[nr / __BITS_PER_LONG])) != 0;
- }
- INLINE int test_and_clear_bit(int nr, volatile unsigned long *addr) {
- const unsigned b = ((1UL << (nr % __BITS_PER_LONG)) & (addr[nr / __BITS_PER_LONG]));
- clear_bit(nr, addr);
- return b != 0;
- }
- /* awkward implement */
- INLINE long find_next_zero_bit(const unsigned long *addr,
- unsigned long size, unsigned long offset) {
- int max_of = BITOP_WORD(size);
- int addr_of = BITOP_WORD(offset);
- const unsigned long *temp = addr + addr_of;
- int ofc = offset - (addr_of * __BITS_PER_LONG);
- int i, of;
- for (of = addr_of; of < max_of; of++) {
- for (i = ofc; i < __BITS_PER_LONG; i++) {
- if ((1 << i) & *temp)
- continue;
- else
- break;
- }
- if (i == __BITS_PER_LONG) {
- temp += 1;
- ofc = 0;
- } else
- break;
- }
- return (((of) * __BITS_PER_LONG) + i);
- }
- #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
- #define BITS_PER_BYTE 8
- #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
- /* common */
- #define DECLARE_BITMAP(name, bits) \
- unsigned long name[BITS_TO_LONGS(bits)]
- #define small_const_nbits(nbits) \
- (__builtin_constant_p(nbits) && (nbits) <= __BITS_PER_LONG)
- static inline void bitmap_zero(unsigned long *dst, int nbits)
- {
- if (small_const_nbits(nbits))
- *dst = 0UL;
- else {
- int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
- HV_MEMSET(dst, 0, len);
- }
- }
- #endif
|