From 2625606d4adb70709af454831a4d19c573b543f6 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Mon, 19 Aug 2024 17:10:43 +0800 Subject: [PATCH] update booster source code --- booster/testcase/makefile | 21 - /dev/null | 520 ---------------------------------------------------- booster/list.h | 1 booster/testcase/logger.c | 0 booster/makefile | 20 - booster/testcase/comport.c | 0 booster/comport.c | 2 7 files changed, 13 insertions(+), 551 deletions(-) diff --git a/booster/comport.c b/booster/comport.c index 4a31278..e834d38 100644 --- a/booster/comport.c +++ b/booster/comport.c @@ -425,7 +425,7 @@ if( bytes >= buf_size ) break; - /* try to read data in 1ms again, if no data arrive it will break */ + /* try to read data in 10ms again, if no data arrive it will break */ to.tv_sec = 0; to.tv_usec = 10000; to_ptr = &to; diff --git a/booster/linux_list.h b/booster/linux_list.h deleted file mode 100644 index b927b14..0000000 --- a/booster/linux_list.h +++ /dev/null @@ -1,723 +0,0 @@ -/********************************************************************************* - * Copyright: (C) 2020 LingYun IoT System Studio - * All rights reserved. - * - * Filename: linux_list.h - * Description: This file is copied from Linux kernel, which provide link list API. - * - * Version: 1.0.0(08/09/2020) - * Author: Guo Wenxue <guowenxue@gmail.com> - * ChangeLog: 1, Release initial version on "08/09/2020 02:24:34 AM" - * - ********************************************************************************/ - -#ifndef _LINUX_LIST_H -#define _LINUX_LIST_H - -#include <linux/stddef.h> - - -/** - * container_of - cast a member of a structure out to the containing structure - * @ptr: the pointer to the member. - * @type: the type of the container struct this is embedded in. - * @member: the name of the member within the struct. - * - */ -#undef offsetof -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) - - -/* - * Architectures might want to move the poison pointer offset - * into some well-recognized area such as 0xdead000000000000, - * that is also not mappable by user-space exploits: - */ -#ifdef CONFIG_ILLEGAL_POINTER_VALUE -# define POISON_POINTER_DELTA _AC(CONFIG_ILLEGAL_POINTER_VALUE, UL) -#else -# define POISON_POINTER_DELTA 0 -#endif - -/* - * These are non-NULL pointers that will result in page faults - * under normal circumstances, used to verify that nobody uses - * non-initialized list entries. - */ -#define LIST_POISON1 ((void *) 0x00100100 + POISON_POINTER_DELTA) -#define LIST_POISON2 ((void *) 0x00200200 + POISON_POINTER_DELTA) - -#ifndef ARCH_HAS_PREFETCH -#define ARCH_HAS_PREFETCH -static inline void prefetch(const void *x) {;} -#endif - -/* - * Simple doubly linked list implementation. - * - * Some of the internal functions ("__xxx") are useful when - * manipulating whole lists rather than single entries, as - * sometimes we already know the next/prev entries and we can - * generate better code by using them directly rather than - * using the generic single-entry routines. - */ - -struct list_head { - struct list_head *next, *prev; -}; - -#define LIST_HEAD_INIT(name) { &(name), &(name) } - -#define LIST_HEAD(name) \ - struct list_head name = LIST_HEAD_INIT(name) - -static inline void INIT_LIST_HEAD(struct list_head *list) -{ - list->next = list; - list->prev = list; -} - -/* - * Insert a new entry between two known consecutive entries. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static inline void __list_add(struct list_head *new, - struct list_head *prev, - struct list_head *next) -{ - next->prev = new; - new->next = next; - new->prev = prev; - prev->next = new; -} - -/** - * list_add - add a new entry - * @new: new entry to be added - * @head: list head to add it after - * - * Insert a new entry after the specified head. - * This is good for implementing stacks. - */ -static inline void list_add(struct list_head *new, struct list_head *head) -{ - __list_add(new, head, head->next); -} - -/** - * list_add_tail - add a new entry - * @new: new entry to be added - * @head: list head to add it before - * - * Insert a new entry before the specified head. - * This is useful for implementing queues. - */ -static inline void list_add_tail(struct list_head *new, struct list_head *head) -{ - __list_add(new, head->prev, head); -} - -/* - * Delete a list entry by making the prev/next entries - * point to each other. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static inline void __list_del(struct list_head *prev, struct list_head *next) -{ - next->prev = prev; - prev->next = next; -} - -/** - * list_del - deletes entry from list. - * @entry: the element to delete from the list. - * Note: list_empty() on entry does not return true after this, the entry is - * in an undefined state. - */ -static inline void list_del(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - entry->next = LIST_POISON1; - entry->prev = LIST_POISON2; -} - -/** - * list_replace - replace old entry by new one - * @old : the element to be replaced - * @new : the new element to insert - * - * If @old was empty, it will be overwritten. - */ -static inline void list_replace(struct list_head *old, - struct list_head *new) -{ - new->next = old->next; - new->next->prev = new; - new->prev = old->prev; - new->prev->next = new; -} - -static inline void list_replace_init(struct list_head *old, - struct list_head *new) -{ - list_replace(old, new); - INIT_LIST_HEAD(old); -} - -/** - * list_del_init - deletes entry from list and reinitialize it. - * @entry: the element to delete from the list. - */ -static inline void list_del_init(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - INIT_LIST_HEAD(entry); -} - -/** - * list_move - delete from one list and add as another's head - * @list: the entry to move - * @head: the head that will precede our entry - */ -static inline void list_move(struct list_head *list, struct list_head *head) -{ - __list_del(list->prev, list->next); - list_add(list, head); -} - -/** - * list_move_tail - delete from one list and add as another's tail - * @list: the entry to move - * @head: the head that will follow our entry - */ -static inline void list_move_tail(struct list_head *list, - struct list_head *head) -{ - __list_del(list->prev, list->next); - list_add_tail(list, head); -} - -/** - * list_is_last - tests whether @list is the last entry in list @head - * @list: the entry to test - * @head: the head of the list - */ -static inline int list_is_last(const struct list_head *list, - const struct list_head *head) -{ - return list->next == head; -} - -/** - * list_empty - tests whether a list is empty - * @head: the list to test. - */ -static inline int list_empty(const struct list_head *head) -{ - return head->next == head; -} - -/** - * list_empty_careful - tests whether a list is empty and not being modified - * @head: the list to test - * - * Description: - * tests whether a list is empty _and_ checks that no other CPU might be - * in the process of modifying either member (next or prev) - * - * NOTE: using list_empty_careful() without synchronization - * can only be safe if the only activity that can happen - * to the list entry is list_del_init(). Eg. it cannot be used - * if another CPU could re-list_add() it. - */ -static inline int list_empty_careful(const struct list_head *head) -{ - struct list_head *next = head->next; - return (next == head) && (next == head->prev); -} - -/** - * list_is_singular - tests whether a list has just one entry. - * @head: the list to test. - */ -static inline int list_is_singular(const struct list_head *head) -{ - return !list_empty(head) && (head->next == head->prev); -} - -static inline void __list_cut_position(struct list_head *list, - struct list_head *head, struct list_head *entry) -{ - struct list_head *new_first = entry->next; - list->next = head->next; - list->next->prev = list; - list->prev = entry; - entry->next = list; - head->next = new_first; - new_first->prev = head; -} - -/** - * list_cut_position - cut a list into two - * @list: a new list to add all removed entries - * @head: a list with entries - * @entry: an entry within head, could be the head itself - * and if so we won't cut the list - * - * This helper moves the initial part of @head, up to and - * including @entry, from @head to @list. You should - * pass on @entry an element you know is on @head. @list - * should be an empty list or a list you do not care about - * losing its data. - * - */ -static inline void list_cut_position(struct list_head *list, - struct list_head *head, struct list_head *entry) -{ - if (list_empty(head)) - return; - if (list_is_singular(head) && - (head->next != entry && head != entry)) - return; - if (entry == head) - INIT_LIST_HEAD(list); - else - __list_cut_position(list, head, entry); -} - -static inline void __list_splice(const struct list_head *list, - struct list_head *prev, - struct list_head *next) -{ - struct list_head *first = list->next; - struct list_head *last = list->prev; - - first->prev = prev; - prev->next = first; - - last->next = next; - next->prev = last; -} - -/** - * list_splice - join two lists, this is designed for stacks - * @list: the new list to add. - * @head: the place to add it in the first list. - */ -static inline void list_splice(const struct list_head *list, - struct list_head *head) -{ - if (!list_empty(list)) - __list_splice(list, head, head->next); -} - -/** - * list_splice_tail - join two lists, each list being a queue - * @list: the new list to add. - * @head: the place to add it in the first list. - */ -static inline void list_splice_tail(struct list_head *list, - struct list_head *head) -{ - if (!list_empty(list)) - __list_splice(list, head->prev, head); -} - -/** - * list_splice_init - join two lists and reinitialise the emptied list. - * @list: the new list to add. - * @head: the place to add it in the first list. - * - * The list at @list is reinitialised - */ -static inline void list_splice_init(struct list_head *list, - struct list_head *head) -{ - if (!list_empty(list)) { - __list_splice(list, head, head->next); - INIT_LIST_HEAD(list); - } -} - -/** - * list_splice_tail_init - join two lists and reinitialise the emptied list - * @list: the new list to add. - * @head: the place to add it in the first list. - * - * Each of the lists is a queue. - * The list at @list is reinitialised - */ -static inline void list_splice_tail_init(struct list_head *list, - struct list_head *head) -{ - if (!list_empty(list)) { - __list_splice(list, head->prev, head); - INIT_LIST_HEAD(list); - } -} - -/** - * list_entry - get the struct for this entry - * @ptr: the &struct list_head pointer. - * @type: the type of the struct this is embedded in. - * @member: the name of the list_struct within the struct. - */ -#define list_entry(ptr, type, member) \ - container_of(ptr, type, member) - -/** - * list_first_entry - get the first element from a list - * @ptr: the list head to take the element from. - * @type: the type of the struct this is embedded in. - * @member: the name of the list_struct within the struct. - * - * Note, that list is expected to be not empty. - */ -#define list_first_entry(ptr, type, member) \ - list_entry((ptr)->next, type, member) - -/** - * list_for_each - iterate over a list - * @pos: the &struct list_head to use as a loop cursor. - * @head: the head for your list. - */ -#define list_for_each(pos, head) \ - for (pos = (head)->next; prefetch(pos->next), pos != (head); \ - pos = pos->next) - -/** - * __list_for_each - iterate over a list - * @pos: the &struct list_head to use as a loop cursor. - * @head: the head for your list. - * - * This variant differs from list_for_each() in that it's the - * simplest possible list iteration code, no prefetching is done. - * Use this for code that knows the list to be very short (empty - * or 1 entry) most of the time. - */ -#define __list_for_each(pos, head) \ - for (pos = (head)->next; pos != (head); pos = pos->next) - -/** - * list_for_each_prev - iterate over a list backwards - * @pos: the &struct list_head to use as a loop cursor. - * @head: the head for your list. - */ -#define list_for_each_prev(pos, head) \ - for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \ - pos = pos->prev) - -/** - * list_for_each_safe - iterate over a list safe against removal of list entry - * @pos: the &struct list_head to use as a loop cursor. - * @n: another &struct list_head to use as temporary storage - * @head: the head for your list. - */ -#define list_for_each_safe(pos, n, head) \ - for (pos = (head)->next, n = pos->next; pos != (head); \ - pos = n, n = pos->next) - -/** - * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry - * @pos: the &struct list_head to use as a loop cursor. - * @n: another &struct list_head to use as temporary storage - * @head: the head for your list. - */ -#define list_for_each_prev_safe(pos, n, head) \ - for (pos = (head)->prev, n = pos->prev; \ - prefetch(pos->prev), pos != (head); \ - pos = n, n = pos->prev) - -/** - * list_for_each_entry - iterate over list of given type - * @pos: the type * to use as a loop cursor. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry(pos, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member); \ - prefetch(pos->member.next), &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member)) - -/** - * list_for_each_entry_reverse - iterate backwards over list of given type. - * @pos: the type * to use as a loop cursor. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry_reverse(pos, head, member) \ - for (pos = list_entry((head)->prev, typeof(*pos), member); \ - prefetch(pos->member.prev), &pos->member != (head); \ - pos = list_entry(pos->member.prev, typeof(*pos), member)) - -/** - * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue() - * @pos: the type * to use as a start point - * @head: the head of the list - * @member: the name of the list_struct within the struct. - * - * Prepares a pos entry for use as a start point in list_for_each_entry_continue(). - */ -#define list_prepare_entry(pos, head, member) \ - ((pos) ? : list_entry(head, typeof(*pos), member)) - -/** - * list_for_each_entry_continue - continue iteration over list of given type - * @pos: the type * to use as a loop cursor. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - * - * Continue to iterate over list of given type, continuing after - * the current position. - */ -#define list_for_each_entry_continue(pos, head, member) \ - for (pos = list_entry(pos->member.next, typeof(*pos), member); \ - prefetch(pos->member.next), &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member)) - -/** - * list_for_each_entry_continue_reverse - iterate backwards from the given point - * @pos: the type * to use as a loop cursor. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - * - * Start to iterate over list of given type backwards, continuing after - * the current position. - */ -#define list_for_each_entry_continue_reverse(pos, head, member) \ - for (pos = list_entry(pos->member.prev, typeof(*pos), member); \ - prefetch(pos->member.prev), &pos->member != (head); \ - pos = list_entry(pos->member.prev, typeof(*pos), member)) - -/** - * list_for_each_entry_from - iterate over list of given type from the current point - * @pos: the type * to use as a loop cursor. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - * - * Iterate over list of given type, continuing from current position. - */ -#define list_for_each_entry_from(pos, head, member) \ - for (; prefetch(pos->member.next), &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member)) - -/** - * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry - * @pos: the type * to use as a loop cursor. - * @n: another type * to use as temporary storage - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry_safe(pos, n, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member), \ - n = list_entry(pos->member.next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = n, n = list_entry(n->member.next, typeof(*n), member)) - -/** - * list_for_each_entry_safe_continue - * @pos: the type * to use as a loop cursor. - * @n: another type * to use as temporary storage - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - * - * Iterate over list of given type, continuing after current point, - * safe against removal of list entry. - */ -#define list_for_each_entry_safe_continue(pos, n, head, member) \ - for (pos = list_entry(pos->member.next, typeof(*pos), member), \ - n = list_entry(pos->member.next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = n, n = list_entry(n->member.next, typeof(*n), member)) - -/** - * list_for_each_entry_safe_from - * @pos: the type * to use as a loop cursor. - * @n: another type * to use as temporary storage - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - * - * Iterate over list of given type from current point, safe against - * removal of list entry. - */ -#define list_for_each_entry_safe_from(pos, n, head, member) \ - for (n = list_entry(pos->member.next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = n, n = list_entry(n->member.next, typeof(*n), member)) - -/** - * list_for_each_entry_safe_reverse - * @pos: the type * to use as a loop cursor. - * @n: another type * to use as temporary storage - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - * - * Iterate backwards over list of given type, safe against removal - * of list entry. - */ -#define list_for_each_entry_safe_reverse(pos, n, head, member) \ - for (pos = list_entry((head)->prev, typeof(*pos), member), \ - n = list_entry(pos->member.prev, typeof(*pos), member); \ - &pos->member != (head); \ - pos = n, n = list_entry(n->member.prev, typeof(*n), member)) - -/* - * Double linked lists with a single pointer list head. - * Mostly useful for hash tables where the two pointer list head is - * too wasteful. - * You lose the ability to access the tail in O(1). - */ - -struct hlist_head { - struct hlist_node *first; -}; - -struct hlist_node { - struct hlist_node *next, **pprev; -}; - -#define HLIST_HEAD_INIT { .first = NULL } -#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } -#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) -static inline void INIT_HLIST_NODE(struct hlist_node *h) -{ - h->next = NULL; - h->pprev = NULL; -} - -static inline int hlist_unhashed(const struct hlist_node *h) -{ - return !h->pprev; -} - -static inline int hlist_empty(const struct hlist_head *h) -{ - return !h->first; -} - -static inline void __hlist_del(struct hlist_node *n) -{ - struct hlist_node *next = n->next; - struct hlist_node **pprev = n->pprev; - *pprev = next; - if (next) - next->pprev = pprev; -} - -static inline void hlist_del(struct hlist_node *n) -{ - __hlist_del(n); - n->next = LIST_POISON1; - n->pprev = LIST_POISON2; -} - -static inline void hlist_del_init(struct hlist_node *n) -{ - if (!hlist_unhashed(n)) { - __hlist_del(n); - INIT_HLIST_NODE(n); - } -} - -static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) -{ - struct hlist_node *first = h->first; - n->next = first; - if (first) - first->pprev = &n->next; - h->first = n; - n->pprev = &h->first; -} - -/* next must be != NULL */ -static inline void hlist_add_before(struct hlist_node *n, - struct hlist_node *next) -{ - n->pprev = next->pprev; - n->next = next; - next->pprev = &n->next; - *(n->pprev) = n; -} - -static inline void hlist_add_after(struct hlist_node *n, - struct hlist_node *next) -{ - next->next = n->next; - n->next = next; - next->pprev = &n->next; - - if(next->next) - next->next->pprev = &next->next; -} - -#define hlist_entry(ptr, type, member) container_of(ptr,type,member) - -#define hlist_for_each(pos, head) \ - for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \ - pos = pos->next) - -#define hlist_for_each_safe(pos, n, head) \ - for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ - pos = n) - -/** - * hlist_for_each_entry - iterate over list of given type - * @tpos: the type * to use as a loop cursor. - * @pos: the &struct hlist_node to use as a loop cursor. - * @head: the head for your list. - * @member: the name of the hlist_node within the struct. - */ -#define hlist_for_each_entry(tpos, pos, head, member) \ - for (pos = (head)->first; \ - pos && ({ prefetch(pos->next); 1;}) && \ - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ - pos = pos->next) - -/** - * hlist_for_each_entry_continue - iterate over a hlist continuing after current point - * @tpos: the type * to use as a loop cursor. - * @pos: the &struct hlist_node to use as a loop cursor. - * @member: the name of the hlist_node within the struct. - */ -#define hlist_for_each_entry_continue(tpos, pos, member) \ - for (pos = (pos)->next; \ - pos && ({ prefetch(pos->next); 1;}) && \ - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ - pos = pos->next) - -/** - * hlist_for_each_entry_from - iterate over a hlist continuing from current point - * @tpos: the type * to use as a loop cursor. - * @pos: the &struct hlist_node to use as a loop cursor. - * @member: the name of the hlist_node within the struct. - */ -#define hlist_for_each_entry_from(tpos, pos, member) \ - for (; pos && ({ prefetch(pos->next); 1;}) && \ - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ - pos = pos->next) - -/** - * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry - * @tpos: the type * to use as a loop cursor. - * @pos: the &struct hlist_node to use as a loop cursor. - * @n: another &struct hlist_node to use as temporary storage - * @head: the head for your list. - * @member: the name of the hlist_node within the struct. - */ -#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ - for (pos = (head)->first; \ - pos && ({ n = pos->next; 1; }) && \ - ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ - pos = n) - - -#endif - - diff --git a/booster/list.h b/booster/list.h index 2a333f4..3aa6997 100644 --- a/booster/list.h +++ b/booster/list.h @@ -16,7 +16,6 @@ #include <linux/stddef.h> - /** * container_of - cast a member of a structure out to the containing structure * @ptr: the pointer to the member. diff --git a/booster/makefile b/booster/makefile index 0fd869e..b988130 100644 --- a/booster/makefile +++ b/booster/makefile @@ -13,25 +13,23 @@ PWD=$(shell pwd ) -BUILD_ARCH=$(shell uname -m) -ifneq ($(findstring $(BUILD_ARCH), "x86_64" "i386"),) - CROSS_COMPILE?=arm-linux-gnueabihf- -endif - -#CROSS_COMPILE= +#CROSS_COMPILE=arm-linux-gnueabihf- LIBNAME=$(shell basename ${PWD} ) -TOPDIR=$(shell dirname ${PWD} ) -CFLAGS+=-D_GNU_SOURCE all: clean @rm -f *.o - @${CROSS_COMPILE}gcc ${CFLAGS} -I${TOPDIR} -c *.c + @${CROSS_COMPILE}gcc ${CFLAGS} -c *.c ${CROSS_COMPILE}ar -rcs lib${LIBNAME}.a *.o clean: - @rm -f *.o - @rm -f *.a + @rm -f *.o *.a + +test: + make -C testcase CROSS_COMPILE=${CROSS_COMPILE} distclean: @make clean + @make clean -C testcase + +.PHONY: clean test distclean diff --git a/booster/test/gpio-scripts/pinctrl-igkboard b/booster/test/gpio-scripts/pinctrl-igkboard deleted file mode 100755 index 8236472..0000000 --- a/booster/test/gpio-scripts/pinctrl-igkboard +++ /dev/null @@ -1,144 +0,0 @@ -#!/bin/bash -# This shell script used to control GPIO port on IGKBoard - -direction=out -sysdir=/sys/class/gpio/ -pinbase=0 -groupin=32 - -pinnum= -pindir= -action= - -set -u - -# RedLed: GPIO01_IO11 GreenLed: GPIO01_IO10 BlueLed: GPIO05_IO09 -function usage() -{ - echo "Show pinmap Usage: $0 [-v]" - echo "Output set Usage: $0 GPIO01_IO11 [1/0]" - echo "Input read Usage: $0 [-i] GPIO01_IO11" - echo "Unexport Usage: $0 [-u] GPIO01_IO11" - exit; -} - -function show_pinmap() -{ - echo " -+-------------+-------------+---IGKBoard---+-------------+-------------+ -| GPIO | Name | Physical | Name | GPIO | -+-------------+-------------+-----++------+-------------+-------------+ -| 3.3v | 3.3v | 1 || 2 | 5v | 5v | -| GPIO01_IO03 | I2C1_SDA | 3 || 4 | 5v | 5v | -| GPIO01_IO02 | I2C1_SCL | 5 || 6 | GND | GND | -| GPIO01_IO18 | GPIO | 7 || 8 | UART2_TX | GPIO01_IO20 | -| GND | GND | 9 || 10 | UART2_RX | GPIO01_IO21 | -| GPIO01_IO24 | UART3_TX | 11 || 12 | UART3_RX | GPIO01_IO25 | -| GPIO01_IO28 | UART4_TX | 13 || 14 | GND | GND | -| GPIO01_IO29 | UART4_RX | 15 || 16 | UART7_TX | GPIO03_IO21 | -| 3.3v | 3.3v | 17 || 18 | UART7_RX | GPIO03_IO22 | -| GPIO03_IO27 | SPI1_MOSI | 19 || 20 | GND | GND | -| GPIO03_IO28 | SPI1_MISO | 21 || 22 | GPIO | GPIO03_IO23 | -| GPIO03_IO25 | SPI1_SCLK | 23 || 24 | SPI1_SS0 | GPIO03_IO26 | -| GND | GND | 25 || 26 | GPIO | GPIO03_IO24 | -| GPIO01_IO26 | CAN1_TX | 27 || 28 | PWM8 | GPIO01_IO15 | -| GPIO01_IO27 | CAN1_RX | 29 || 30 | GND | GND | -| GPIO01_IO22 | CAN2_TX | 31 || 32 | PWM7 | GPIO01_IO14 | -| GPIO01_IO23 | CAN2_RX | 33 || 34 | GND | GND | -| GPIO05_IO01 | GPIO | 35 || 36 | GPIO | GPIO01_IO11 | -| GPIO05_IO08 | GPIO | 37 || 38 | GPIO | GPIO01_IO10 | -| GND | GND | 39 || 40 | GPIO | GPIO05_IO09 | -+-------------+-------------+---IGKBoard--+-------------+-------------+ -| GPIO | Name | Physical | Name | GPIO | -+-------------+-------------+-----++------+-------------+-------------+ -" - exit 0; -} - -function calc_pinum() -{ - pinstr=$1 - - group=`echo $pinstr | cut -d_ -f1 | tr -cd "[0-9]"` - pin=`echo $pinstr | cut -d_ -f2 | tr -cd "[0-9]"` - - - group=`expr $group \- 1` - pinum=`expr $group \* $groupin + $pin + $pinbase` - pindir=$sysdir/gpio$pinum - - #echo "INFO: GPIO $pinstr map to pinum[$pinum]" -} - -function export_gpio() -{ - if [ -e $pindir ] ; then - return ; - fi - - echo $pinum > $sysdir/export -} - -function unexport_gpio() -{ - if [ ! -e $pindir ] ; then - return ; - fi - - echo $pinum > $sysdir/unexport -} - -function set_gpio() -{ - echo out > $pindir/direction - echo $1 > $pindir/value -} - -function read_gpio() -{ - echo in > $pindir/direction - cat $pindir/value -} - -if [ $# -lt 1 ] ; then - usage; -fi - -while getopts "iuvh" OPTNAME -do - case "${OPTNAME}" in - "i") - direction=in - shift - ;; - - "u") - action=unexport; - shift - ;; - - "v") - show_pinmap; - shift - ;; - - "h") - usage; - ;; - esac -done - -calc_pinum $1 - -if [[ $action == unexport ]] ; then - unexport_gpio - exit; -fi - -export_gpio - -if [ $direction == in ] ; then - read_gpio -else - set_gpio $2 -fi diff --git a/booster/test/gpio-scripts/pinloop.sh b/booster/test/gpio-scripts/pinloop.sh deleted file mode 100755 index ab61087..0000000 --- a/booster/test/gpio-scripts/pinloop.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -# 40 Pin Header GPIO loop test script, it based on pinctrl shell script - -function loop_test() -{ - if [ $# != 3 ] ; then - echo "ERROR: Invalid input arguments" - return 1; - fi - - level=$3 - pinctrl $1 $level - res=`pinctrl -i $2` - - printf "$1 out [$level] --> $2 in [$res] : " - if [ $level == $res ] ; then - printf " [ OK ]\n" - else - printf " [ FAIL ]\n" - exit 1; - fi -} - - -if [ $# != 2 ] ; then - echo "" - echo "Usage : $0 Pin1 Pin2" - echo "Example: $0 GPIO01_IO10 GPIO01_IO11" - echo "" - echo "You can check pinmap by 'pinctrl -v' " - echo "" - exit; -fi - - -loop_test $1 $2 1 -loop_test $1 $2 0 - -loop_test $2 $1 1 -loop_test $2 $1 0 - -exit 0; diff --git a/booster/test/i2c_sht20.c b/booster/test/i2c_sht20.c deleted file mode 100644 index b87c0cb..0000000 --- a/booster/test/i2c_sht20.c +++ /dev/null @@ -1,257 +0,0 @@ -/********************************************************************************* - * Copyright: (C) 2022 Guo Wenxue <guowenxue@gmail.com> - * All rights reserved. - * - * Filename: sht20.c - * Description: This file is temperature and relative humidity sensor SHT20 code - * - * Version: 1.0.0(2022/4/14) - * Author: Guo Wenxue <guowenxue@gmail.com> - * ChangeLog: 1, Release initial version on "2022/04/14 12:13:26" - * - ********************************************************************************/ - -/* - * Hardware connection: - * - * Sht20 Module RaspberryPi/IGKBoard - * VCC <-----> 3.3V - * SDA <-----> SDA - * SCL <-----> SCL - * GND <-----> GND - */ - -#include <stdio.h> -#include <fcntl.h> -#include <unistd.h> -#include <sys/ioctl.h> -#include <linux/types.h> -#include <sys/stat.h> -#include <linux/i2c-dev.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> -#include <string.h> -#include <stdint.h> -#include <time.h> -#include <errno.h> -#include <string.h> - - -#define SOFTRESET 0xFE -#define TRIGGER_TEMPERATURE_NO_HOLD 0xF3 -#define TRIGGER_HUMIDITY_NO_HOLD 0xF5 - -static inline void msleep(unsigned long ms); -static inline void dump_buf(const char *prompt, uint8_t *buf, int size); -int sht2x_init(char *i2c_dev); -int sht2x_get_serialnumber(int fd, uint8_t *serialnumber, int size); -int sht2x_get_temp_humidity(int fd, float *temp, float *rh); - -int main(int argc, char **argv) -{ - int fd; - float temp; - float rh; - uint8_t serialnumber[8]; - - if( argc != 2) - { - printf("This program used to do I2C test by sht20 temperature & humidity module.\n"); - printf("Usage: %s /dev/i2c-x\n", argv[0]); - return 0; - } - - fd = sht2x_init(argv[1]); - if(fd < 0) - { - printf("SHT2x initialize failure\n"); - return 1; - } - - if( sht2x_get_serialnumber(fd, serialnumber, 8) < 0) - { - printf("SHT2x get serial number failure\n"); - return 3; - } - - if( sht2x_get_temp_humidity(fd, &temp, &rh) < 0 ) - { - printf("SHT2x get get temperature and relative humidity failure\n"); - return 3; - } - - printf("Temperature=%lf ℃ relative humidity=%lf.\n", temp, rh); - - close(fd); -} - - -static inline void msleep(unsigned long ms) -{ - struct timespec cSleep; - unsigned long ulTmp; - - cSleep.tv_sec = ms / 1000; - if (cSleep.tv_sec == 0) - { - ulTmp = ms * 10000; - cSleep.tv_nsec = ulTmp * 100; - } - else - { - cSleep.tv_nsec = 0; - } - - nanosleep(&cSleep, 0); -} - -static inline void dump_buf(const char *prompt, uint8_t *buf, int size) -{ - int i; - - if( !buf ) - { - return ; - } - - if( prompt ) - { - printf("%s ", prompt); - } - - for(i=0; i<size; i++) - { - printf("%02x ", buf[i]); - } - printf("\n"); - - return ; -} - - -int sht2x_softreset(int fd) -{ - uint8_t buf[4]; - - if( fd<0 ) - { - printf("%s line [%d] %s() get invalid input arguments\n", __FILE__, __LINE__, __func__ ); - return -1; - } - - /* software reset SHT2x */ - memset(buf, 0, sizeof(buf)); - - buf[0] = SOFTRESET; - write(fd, buf, 1); - - msleep(50); - - return 0; -} - -int sht2x_init(char *i2c_dev) -{ - int fd; - - if( (fd=open(i2c_dev, O_RDWR)) < 0) - { - printf("i2c device open failed: %s\n", strerror(errno)); - return -1; - } - - /* set I2C mode and SHT2x slave address */ - ioctl(fd, I2C_TENBIT, 0); /* Not 10-bit but 7-bit mode */ - ioctl(fd, I2C_SLAVE, 0x40); /* set SHT2x slava address 0x40*/ - - if( sht2x_softreset(fd) < 0 ) - { - printf("SHT2x softreset failure\n"); - return -2; - } - - return fd; -} - -int sht2x_get_temp_humidity(int fd, float *temp, float *rh) -{ - uint8_t buf[4]; - - if( fd<0 || !temp || !rh ) - { - printf("%s line [%d] %s() get invalid input arguments\n", __FILE__, __LINE__, __func__ ); - return -1; - } - - /* send trigger temperature measure command and read the data */ - memset(buf, 0, sizeof(buf)); - buf[0]=TRIGGER_TEMPERATURE_NO_HOLD; - write(fd, buf, 1); - - msleep(85); /* datasheet: typ=66, max=85 */ - - memset(buf, 0, sizeof(buf)); - read(fd, buf, 3); - dump_buf("Temperature sample data: ", buf, 3); - *temp = 175.72 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 46.85; - - /* send trigger humidity measure command and read the data */ - memset(buf, 0, sizeof(buf)); - buf[0] = TRIGGER_HUMIDITY_NO_HOLD; - write(fd, buf, 1); - - msleep(29); /* datasheet: typ=22, max=29 */ - memset(buf, 0, sizeof(buf)); - - read(fd, buf, 3); - dump_buf("Relative humidity sample data: ", buf, 3); - *rh = 125 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 6; - - return 0; -} - -int sht2x_get_serialnumber(int fd, uint8_t *serialnumber, int size) -{ - uint8_t buf[4]; - - if( fd<0 || !serialnumber || size!=8 ) - { - printf("%s line [%d] %s() get invalid input arguments\n", __FILE__, __LINE__, __func__ ); - return -1; - } - - /* Read SerialNumber from Location 1 */ - memset(buf, 0, sizeof(buf)); - buf[0] = 0xfa; /* command for readout on-chip memory */ - buf[1] = 0x0f; /* on-chip memory address */ - write(fd, buf, 2); - - memset(buf, 0, sizeof(buf)); - read(fd, buf, 4); - - serialnumber[5]=buf[0]; /* Read SNB_3 */ - serialnumber[4]=buf[1]; /* Read SNB_2 */ - serialnumber[3]=buf[2]; /* Read SNB_1 */ - serialnumber[2]=buf[3]; /* Read SNB_0 */ - - /* Read SerialNumber from Location 2 */ - memset(buf, 0, sizeof(buf) ); - buf[0]=0xfc; /* command for readout on-chip memory */ - buf[1]=0xc9; /* on-chip memory address */ - write(fd, buf, 2); - - memset(buf, 0, sizeof(buf) ); - read(fd, buf, 4); - - serialnumber[1]=buf[0]; /* Read SNC_1 */ - serialnumber[0]=buf[1]; /* Read SNC_0 */ - serialnumber[7]=buf[2]; /* Read SNA_1 */ - serialnumber[6]=buf[3]; /* Read SNA_0 */ - - dump_buf("SHT2x Serial number: ", serialnumber, 8); - - return 0; -} - - diff --git a/booster/test/spidev_test.c b/booster/test/spidev_test.c deleted file mode 100644 index 481b414..0000000 --- a/booster/test/spidev_test.c +++ /dev/null @@ -1,520 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * SPI testing utility (using spidev driver) - * - * Copyright (c) 2007 MontaVista Software, Inc. - * Copyright (c) 2007 Anton Vorontsov <avorontsov@ru.mvista.com> - * - * Cross-compile with cross-gcc -I/path/to/cross-kernel/include - * - * - * SPI loop test usage: - * - * 1. Shortcut MOSI and MISO: - * - * root@igkboard:~# spidev_test -D /dev/spidev0.0 -v - * spi mode: 0x4 - * bits per word: 8 - * max speed: 500000 Hz (500 kHz) - * TX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D - * RX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D - * - * 2. Not shortcut MOSI and MISO: - * - * root@igkboard:~# spidev_test -D /dev/spidev0.0 -v - * spi mode: 0x4 - * bits per word: 8 - * max speed: 500000 Hz (500 kHz) - * TX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D - * RX | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - * - */ - -#include <stdint.h> -#include <unistd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <getopt.h> -#include <fcntl.h> -#include <time.h> -#include <sys/ioctl.h> -#include <linux/ioctl.h> -#include <sys/stat.h> -#include <linux/types.h> -#include <linux/spi/spidev.h> - -#define SPI_TX_OCTAL 0x2000 -#define SPI_RX_OCTAL 0x4000 - -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - -static void pabort(const char *s) -{ - if (errno != 0) - perror(s); - else - printf("%s\n", s); - - abort(); -} - -static const char *device = "/dev/spidev1.1"; -static uint32_t mode; -static uint8_t bits = 8; -static char *input_file; -static char *output_file; -static uint32_t speed = 500000; -static uint16_t delay; -static int verbose; -static int transfer_size; -static int iterations; -static int interval = 5; /* interval in seconds for showing transfer rate */ - -static uint8_t default_tx[] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x95, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x0D, -}; - -static uint8_t default_rx[ARRAY_SIZE(default_tx)] = {0, }; -static char *input_tx; - -static void hex_dump(const void *src, size_t length, size_t line_size, - char *prefix) -{ - int i = 0; - const unsigned char *address = src; - const unsigned char *line = address; - unsigned char c; - - printf("%s | ", prefix); - while (length-- > 0) { - printf("%02X ", *address++); - if (!(++i % line_size) || (length == 0 && i % line_size)) { - if (length == 0) { - while (i++ % line_size) - printf("__ "); - } - printf(" |"); - while (line < address) { - c = *line++; - printf("%c", (c < 32 || c > 126) ? '.' : c); - } - printf("|\n"); - if (length > 0) - printf("%s | ", prefix); - } - } -} - -/* - * Unescape - process hexadecimal escape character - * converts shell input "\x23" -> 0x23 - */ -static int unescape(char *_dst, char *_src, size_t len) -{ - int ret = 0; - int match; - char *src = _src; - char *dst = _dst; - unsigned int ch; - - while (*src) { - if (*src == '\\' && *(src+1) == 'x') { - match = sscanf(src + 2, "%2x", &ch); - if (!match) - pabort("malformed input string"); - - src += 4; - *dst++ = (unsigned char)ch; - } else { - *dst++ = *src++; - } - ret++; - } - return ret; -} - -static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len) -{ - int ret; - int out_fd; - struct spi_ioc_transfer tr = { - .tx_buf = (unsigned long)tx, - .rx_buf = (unsigned long)rx, - .len = len, - .delay_usecs = delay, - .speed_hz = speed, - .bits_per_word = bits, - }; - - if (mode & SPI_TX_OCTAL) - tr.tx_nbits = 8; - else if (mode & SPI_TX_QUAD) - tr.tx_nbits = 4; - else if (mode & SPI_TX_DUAL) - tr.tx_nbits = 2; - if (mode & SPI_RX_OCTAL) - tr.rx_nbits = 8; - else if (mode & SPI_RX_QUAD) - tr.rx_nbits = 4; - else if (mode & SPI_RX_DUAL) - tr.rx_nbits = 2; - if (!(mode & SPI_LOOP)) { - if (mode & (SPI_TX_OCTAL | SPI_TX_QUAD | SPI_TX_DUAL)) - tr.rx_buf = 0; - else if (mode & (SPI_RX_OCTAL | SPI_RX_QUAD | SPI_RX_DUAL)) - tr.tx_buf = 0; - } - - ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); - if (ret < 1) - pabort("can't send spi message"); - - if (verbose) - hex_dump(tx, len, 32, "TX"); - - if (output_file) { - out_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (out_fd < 0) - pabort("could not open output file"); - - ret = write(out_fd, rx, len); - if (ret != len) - pabort("not all bytes written to output file"); - - close(out_fd); - } - - if (verbose) - hex_dump(rx, len, 32, "RX"); -} - -static void print_usage(const char *prog) -{ - printf("Usage: %s [-DsbdlHOLC3vpNR24SI]\n", prog); - puts(" -D --device device to use (default /dev/spidev1.1)\n" - " -s --speed max speed (Hz)\n" - " -d --delay delay (usec)\n" - " -b --bpw bits per word\n" - " -i --input input data from a file (e.g. \"test.bin\")\n" - " -o --output output data to a file (e.g. \"results.bin\")\n" - " -l --loop loopback\n" - " -H --cpha clock phase\n" - " -O --cpol clock polarity\n" - " -L --lsb least significant bit first\n" - " -C --cs-high chip select active high\n" - " -3 --3wire SI/SO signals shared\n" - " -v --verbose Verbose (show tx buffer)\n" - " -p Send data (e.g. \"1234\\xde\\xad\")\n" - " -N --no-cs no chip select\n" - " -R --ready slave pulls low to pause\n" - " -2 --dual dual transfer\n" - " -4 --quad quad transfer\n" - " -8 --octal octal transfer\n" - " -S --size transfer size\n" - " -I --iter iterations\n"); - exit(1); -} - -static void parse_opts(int argc, char *argv[]) -{ - while (1) { - static const struct option lopts[] = { - { "device", 1, 0, 'D' }, - { "speed", 1, 0, 's' }, - { "delay", 1, 0, 'd' }, - { "bpw", 1, 0, 'b' }, - { "input", 1, 0, 'i' }, - { "output", 1, 0, 'o' }, - { "loop", 0, 0, 'l' }, - { "cpha", 0, 0, 'H' }, - { "cpol", 0, 0, 'O' }, - { "lsb", 0, 0, 'L' }, - { "cs-high", 0, 0, 'C' }, - { "3wire", 0, 0, '3' }, - { "no-cs", 0, 0, 'N' }, - { "ready", 0, 0, 'R' }, - { "dual", 0, 0, '2' }, - { "verbose", 0, 0, 'v' }, - { "quad", 0, 0, '4' }, - { "octal", 0, 0, '8' }, - { "size", 1, 0, 'S' }, - { "iter", 1, 0, 'I' }, - { NULL, 0, 0, 0 }, - }; - int c; - - c = getopt_long(argc, argv, "D:s:d:b:i:o:lHOLC3NR248p:vS:I:", - lopts, NULL); - - if (c == -1) - break; - - switch (c) { - case 'D': - device = optarg; - break; - case 's': - speed = atoi(optarg); - break; - case 'd': - delay = atoi(optarg); - break; - case 'b': - bits = atoi(optarg); - break; - case 'i': - input_file = optarg; - break; - case 'o': - output_file = optarg; - break; - case 'l': - mode |= SPI_LOOP; - break; - case 'H': - mode |= SPI_CPHA; - break; - case 'O': - mode |= SPI_CPOL; - break; - case 'L': - mode |= SPI_LSB_FIRST; - break; - case 'C': - mode |= SPI_CS_HIGH; - break; - case '3': - mode |= SPI_3WIRE; - break; - case 'N': - mode |= SPI_NO_CS; - break; - case 'v': - verbose = 1; - break; - case 'R': - mode |= SPI_READY; - break; - case 'p': - input_tx = optarg; - break; - case '2': - mode |= SPI_TX_DUAL; - break; - case '4': - mode |= SPI_TX_QUAD; - break; - case '8': - mode |= SPI_TX_OCTAL; - break; - case 'S': - transfer_size = atoi(optarg); - break; - case 'I': - iterations = atoi(optarg); - break; - default: - print_usage(argv[0]); - } - } - if (mode & SPI_LOOP) { - if (mode & SPI_TX_DUAL) - mode |= SPI_RX_DUAL; - if (mode & SPI_TX_QUAD) - mode |= SPI_RX_QUAD; - if (mode & SPI_TX_OCTAL) - mode |= SPI_RX_OCTAL; - } -} - -static void transfer_escaped_string(int fd, char *str) -{ - size_t size = strlen(str); - uint8_t *tx; - uint8_t *rx; - - tx = malloc(size); - if (!tx) - pabort("can't allocate tx buffer"); - - rx = malloc(size); - if (!rx) - pabort("can't allocate rx buffer"); - - size = unescape((char *)tx, str, size); - transfer(fd, tx, rx, size); - free(rx); - free(tx); -} - -static void transfer_file(int fd, char *filename) -{ - ssize_t bytes; - struct stat sb; - int tx_fd; - uint8_t *tx; - uint8_t *rx; - - if (stat(filename, &sb) == -1) - pabort("can't stat input file"); - - tx_fd = open(filename, O_RDONLY); - if (tx_fd < 0) - pabort("can't open input file"); - - tx = malloc(sb.st_size); - if (!tx) - pabort("can't allocate tx buffer"); - - rx = malloc(sb.st_size); - if (!rx) - pabort("can't allocate rx buffer"); - - bytes = read(tx_fd, tx, sb.st_size); - if (bytes != sb.st_size) - pabort("failed to read input file"); - - transfer(fd, tx, rx, sb.st_size); - free(rx); - free(tx); - close(tx_fd); -} - -static uint64_t _read_count; -static uint64_t _write_count; - -static void show_transfer_rate(void) -{ - static uint64_t prev_read_count, prev_write_count; - double rx_rate, tx_rate; - - rx_rate = ((_read_count - prev_read_count) * 8) / (interval*1000.0); - tx_rate = ((_write_count - prev_write_count) * 8) / (interval*1000.0); - - printf("rate: tx %.1fkbps, rx %.1fkbps\n", rx_rate, tx_rate); - - prev_read_count = _read_count; - prev_write_count = _write_count; -} - -static void transfer_buf(int fd, int len) -{ - uint8_t *tx; - uint8_t *rx; - int i; - - tx = malloc(len); - if (!tx) - pabort("can't allocate tx buffer"); - for (i = 0; i < len; i++) - tx[i] = random(); - - rx = malloc(len); - if (!rx) - pabort("can't allocate rx buffer"); - - transfer(fd, tx, rx, len); - - _write_count += len; - _read_count += len; - - if (mode & SPI_LOOP) { - if (memcmp(tx, rx, len)) { - fprintf(stderr, "transfer error !\n"); - hex_dump(tx, len, 32, "TX"); - hex_dump(rx, len, 32, "RX"); - exit(1); - } - } - - free(rx); - free(tx); -} - -int main(int argc, char *argv[]) -{ - int ret = 0; - int fd; - - parse_opts(argc, argv); - - if (input_tx && input_file) - pabort("only one of -p and --input may be selected"); - - fd = open(device, O_RDWR); - if (fd < 0) - pabort("can't open device"); - - /* - * spi mode - */ - ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode); - if (ret == -1) - pabort("can't set spi mode"); - - ret = ioctl(fd, SPI_IOC_RD_MODE32, &mode); - if (ret == -1) - pabort("can't get spi mode"); - - /* - * bits per word - */ - ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); - if (ret == -1) - pabort("can't set bits per word"); - - ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); - if (ret == -1) - pabort("can't get bits per word"); - - /* - * max speed hz - */ - ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); - if (ret == -1) - pabort("can't set max speed hz"); - - ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); - if (ret == -1) - pabort("can't get max speed hz"); - - printf("spi mode: 0x%x\n", mode); - printf("bits per word: %u\n", bits); - printf("max speed: %u Hz (%u kHz)\n", speed, speed/1000); - - if (input_tx) - transfer_escaped_string(fd, input_tx); - else if (input_file) - transfer_file(fd, input_file); - else if (transfer_size) { - struct timespec last_stat; - - clock_gettime(CLOCK_MONOTONIC, &last_stat); - - while (iterations-- > 0) { - struct timespec current; - - transfer_buf(fd, transfer_size); - - clock_gettime(CLOCK_MONOTONIC, ¤t); - if (current.tv_sec - last_stat.tv_sec > interval) { - show_transfer_rate(); - last_stat = current; - } - } - printf("total: tx %.1fKB, rx %.1fKB\n", - _write_count/1024.0, _read_count/1024.0); - } else - transfer(fd, default_tx, default_rx, sizeof(default_tx)); - - close(fd); - - return ret; -} diff --git a/booster/test/comport.c b/booster/testcase/comport.c similarity index 100% rename from booster/test/comport.c rename to booster/testcase/comport.c diff --git a/booster/test/test_logger.c b/booster/testcase/logger.c similarity index 100% rename from booster/test/test_logger.c rename to booster/testcase/logger.c diff --git a/booster/test/makefile b/booster/testcase/makefile similarity index 79% rename from booster/test/makefile rename to booster/testcase/makefile index 27eda01..b072d52 100644 --- a/booster/test/makefile +++ b/booster/testcase/makefile @@ -13,28 +13,13 @@ #********************************************************************************/ PWD=$(shell pwd) -LIB_PATH=$(shell dirname ${PWD}) -LIB_NAME=$(shell basename ${LIB_PATH}) -INSTPATH=/tftp - -#ARCH ?= i386 -#ARCH?=arm926t -ARCH?=arm920t - -#LINK_MODE=STATIC -MODE=PRODUCTION -DEBUG=1 - INSTPATH=/tftp CROSS_COMPILE?=arm-linux-gnueabihf- +CC=${CROSS_COMPILE}gcc -export CC=${CROSS_COMPILE}gcc -export CXX=${CROSS_COMPILE}g++ -export AR=${CROSS_COMPILE}ar -export AS=${CROSS_COMPILE}as -export RANLIB=${CROSS_COMPILE}ranlib -export STRIP=${CROSS_COMPILE}strip +LIB_PATH=$(shell dirname ${PWD}) +LIB_NAME=$(shell basename ${LIB_PATH}) SRCS = $(wildcard ${VPATH}/*.c) OBJS = $(patsubst %.c,%.o,$(SRCS)) -- Gitblit v1.9.1