diff --git a/libraries/Camera/src/Camera.cpp b/libraries/Camera/src/Camera.cpp index df137fb..8839e7a 100644 --- a/libraries/Camera/src/Camera.cpp +++ b/libraries/Camera/src/Camera.cpp @@ -36,7 +36,7 @@ static const int resolution[][2] = { {1600, 1200}, /* UXGA */ }; -Camera::Camera(framesize_t frameSize = FRAMESIZE_QVGA, pixformat_t pixFormat = PIXFORMAT_RGB565) +Camera::Camera(framesize_t frameSize, pixformat_t pixFormat) { _frameSize = frameSize; _pixFormat = pixFormat; @@ -44,6 +44,14 @@ Camera::Camera(framesize_t frameSize = FRAMESIZE_QVGA, pixformat_t pixFormat = P _height = resolution[frameSize][1]; } +Camera::Camera(int16_t width, uint16_t height, pixformat_t pixFormat) +{ + _frameSize = FRAMESIZE_CUSTOM; + _pixFormat = pixFormat; + _width = width; + _height = height; +} + Camera::~Camera() { diff --git a/libraries/Camera/src/Camera.h b/libraries/Camera/src/Camera.h index b42b3cc..c067b2a 100644 --- a/libraries/Camera/src/Camera.h +++ b/libraries/Camera/src/Camera.h @@ -44,6 +44,7 @@ typedef enum { FRAMESIZE_SVGA, // 800x600 FRAMESIZE_SXGA, // 1280x1024 FRAMESIZE_UXGA, // 1600x1200 + FRAMESIZE_CUSTOM, } framesize_t; @@ -51,6 +52,7 @@ class Camera{ public: Camera(framesize_t frameSize, pixformat_t pixFormat); + Camera(int16_t width, uint16_t height, pixformat_t pixFormat); ~Camera(); virtual bool begin( ) = 0; virtual void end() = 0; @@ -64,8 +66,16 @@ public: * If pixels format is RGB565: return RGB565 pixels with every uint16_t one pixel, e.g. RED: 0xF800 */ virtual uint8_t* snapshot() = 0; - virtual uint8_t* getRGB565(){ return 0; }; - virtual uint8_t* getRGB888(){ return 0; }; + /** + * @return pixels with RGB565 format, every uint16_t one pixel, e.g. RED: 0xF800, so two pixels: {0xF800, 0xF800} + */ + virtual uint16_t* getRGB565(){ return nullptr; }; + /** + * + * @return pixels with RGB888 format, for n pixels: {{R0,R1,...,Rn-1,},{G0,G1,...,Gn-1},{B0,B1,...,Bn-1}} + * e.g. two RED pixel: {0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00} + */ + virtual uint8_t* getRGB888(){ return nullptr; }; virtual void setRotaion(uint8_t rotation) = 0; virtual void setInvert(bool invert) = 0; diff --git a/libraries/KPU/examples/mobilenet_v1/MBNet_1000.cpp b/libraries/KPU/examples/mobilenet_v1/MBNet_1000.cpp new file mode 100644 index 0000000..d59ac84 --- /dev/null +++ b/libraries/KPU/examples/mobilenet_v1/MBNet_1000.cpp @@ -0,0 +1,208 @@ +/** + * @file MBNet_1000.cpp + * @brief Detect object type + * @author Neucrack@sipeed.com + */ + + +#include "MBNet_1000.h" +#include "names.h" +#include "stdlib.h" + + +MBNet_1000::MBNet_1000(KPUClass& kpu, Sipeed_ST7789& lcd, Sipeed_OV2640& camera) +:_kpu(kpu),_lcd(lcd), _camera(camera), +_count(0), _result(nullptr) +{ + _names = mbnet_label_name; + memset(_statistics, 0, sizeof(_statistics)); +} + +MBNet_1000::~MBNet_1000() +{ + +} + + +int MBNet_1000::begin(const char* kmodel_name) +{ + File myFile; + if(!_camera.begin()) + return -1; + if(!_lcd.begin(15000000, COLOR_RED)) + return -2; + _camera.run(true); + + if (!SD.begin()) + return -3; + + myFile = SD.open(kmodel_name); + if (!myFile) + return -4; + uint32_t fSize = myFile.size(); + _lcd.setTextSize(2); + _lcd.setTextColor(COLOR_WHITE); + _lcd.setCursor(100,100); + _lcd.print("Loading ... "); + long ret = myFile.read(_model, fSize); + myFile.close(); + if(ret != fSize) + return -5; + + if(_kpu.begin(_model) != 0) + return -6; + return 0; +} + +int MBNet_1000::detect() +{ + uint8_t* img; + uint8_t* img888; + + img = _camera.snapshot(); + if(img == nullptr || img==0) + return -1; + img888 = _camera.getRGB888(); + if(_kpu.forward(img888) != 0) + { + return -2; + } + while( !_kpu.isForwardOk() ); + if( _kpu.getResult((uint8_t**)&_result, &_count) != 0) + { + return -3; + } + return 0; +} + +void MBNet_1000::show() +{ + float prob; + const char* name; + uint8_t i, j; + uint16_t* img; + + _count /= sizeof(float); + label_init(); + label_sort(); + + for(j=0; j max) + { + max = _statistics[i].sum; + index1 = i; + } + else if(_statistics[i].sum > second && _statistics[i].sum +#include + +#define KMODEL_SIZE (4220 * 1024) +#define STATISTICS_NUM 5 + +typedef struct{ + const char* name; + float sum; + bool updated; +} statistics_t; + + +class MBNet_1000{ + +public: + MBNet_1000(KPUClass& kpu, Sipeed_ST7789& lcd, Sipeed_OV2640& camera); + ~MBNet_1000(); + int begin(const char* kmodel_name); + int detect(); + void show(); + const char** _names; + +private: + KPUClass& _kpu; + Sipeed_ST7789& _lcd; + Sipeed_OV2640& _camera; + uint8_t _model[KMODEL_SIZE] __attribute__((aligned(128))); + size_t _count; + statistics_t _statistics[STATISTICS_NUM]; + float* _result; + uint16_t _index[1000]; + + void label_init(); + void label_get(uint16_t index, float* prob, const char** name); + void label_sort(void); +}; + + +#endif + diff --git a/libraries/KPU/examples/mobilenet_v1/mobilenet_v1.ino b/libraries/KPU/examples/mobilenet_v1/mobilenet_v1.ino new file mode 100644 index 0000000..0241d38 --- /dev/null +++ b/libraries/KPU/examples/mobilenet_v1/mobilenet_v1.ino @@ -0,0 +1,54 @@ + +/** + * + * + * Download model here: + * http://dl.sipeed.com/MAIX/MaixPy/model/mobilenet_0x300000.kfpkg + * Unpack it(zip format), get m.kmodel, change name to a short name "m" for example, + * put it in SD card at root path + * + * + * + */ + + +#include +#include +#include "MBNet_1000.h" + + +SPIClass spi_(SPI0); // MUST be SPI0 for Maix series on board LCD +Sipeed_ST7789 lcd(320, 240, spi_); +Sipeed_OV2640 camera(224, 224, PIXFORMAT_RGB565); +KPUClass KPU; +MBNet_1000 mbnet(KPU, lcd, camera); + +const char* kmodel_name = "m"; + + +void setup() +{ + Serial.begin(115200); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + Serial.println("init mobile net, load kmodel from SD card, it may takes a long time"); + if( mbnet.begin(kmodel_name) != 0) + { + Serial.println("mobile net init fail"); + while(1); + } + +} + +void loop() +{ + if(mbnet.detect() != 0) + { + Serial.println("detect object fail"); + return; + } + mbnet.show(); +} + diff --git a/libraries/KPU/examples/mobilenet_v1/names.cpp b/libraries/KPU/examples/mobilenet_v1/names.cpp new file mode 100644 index 0000000..c76a703 --- /dev/null +++ b/libraries/KPU/examples/mobilenet_v1/names.cpp @@ -0,0 +1,1001 @@ +const char* mbnet_label_name[1000]={"tench, Tinca tinca", +"goldfish, Carassius auratus", +"great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias", +"tiger shark, Galeocerdo cuvieri", +"hammerhead, hammerhead shark", +"electric ray, crampfish, numbfish, torpedo", +"stingray", +"cock", +"hen", +"ostrich, Struthio camelus", +"brambling, Fringilla montifringilla", +"goldfinch, Carduelis carduelis", +"house finch, linnet, Carpodacus mexicanus", +"junco, snowbird", +"indigo bunting, indigo finch, indigo bird, Passerina cyanea", +"robin, American robin, Turdus migratorius", +"bulbul", +"jay", +"magpie", +"chickadee", +"water ouzel, dipper", +"kite", +"bald eagle, American eagle, Haliaeetus leucocephalus", +"vulture", +"great grey owl, great gray owl, Strix nebulosa", +"European fire salamander, Salamandra salamandra", +"common newt, Triturus vulgaris", +"eft", +"spotted salamander, Ambystoma maculatum", +"axolotl, mud puppy, Ambystoma mexicanum", +"bullfrog, Rana catesbeiana", +"tree frog, tree-frog", +"tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui", +"loggerhead, loggerhead turtle, Caretta caretta", +"leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea", +"mud turtle", +"terrapin", +"box turtle, box tortoise", +"banded gecko", +"common iguana, iguana, Iguana iguana", +"American chameleon, anole, Anolis carolinensis", +"whiptail, whiptail lizard", +"agama", +"frilled lizard, Chlamydosaurus kingi", +"alligator lizard", +"Gila monster, Heloderma suspectum", +"green lizard, Lacerta viridis", +"African chameleon, Chamaeleo chamaeleon", +"Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis", +"African crocodile, Nile crocodile, Crocodylus niloticus", +"American alligator, Alligator mississipiensis", +"triceratops", +"thunder snake, worm snake, Carphophis amoenus", +"ringneck snake, ring-necked snake, ring snake", +"hognose snake, puff adder, sand viper", +"green snake, grass snake", +"king snake, kingsnake", +"garter snake, grass snake", +"water snake", +"vine snake", +"night snake, Hypsiglena torquata", +"boa constrictor, Constrictor constrictor", +"rock python, rock snake, Python sebae", +"Indian cobra, Naja naja", +"green mamba", +"sea snake", +"horned viper, cerastes, sand viper, horned asp, Cerastes cornutus", +"diamondback, diamondback rattlesnake, Crotalus adamanteus", +"sidewinder, horned rattlesnake, Crotalus cerastes", +"trilobite", +"harvestman, daddy longlegs, Phalangium opilio", +"scorpion", +"black and gold garden spider, Argiope aurantia", +"barn spider, Araneus cavaticus", +"garden spider, Aranea diademata", +"black widow, Latrodectus mactans", +"tarantula", +"wolf spider, hunting spider", +"tick", +"centipede", +"black grouse", +"ptarmigan", +"ruffed grouse, partridge, Bonasa umbellus", +"prairie chicken, prairie grouse, prairie fowl", +"peacock", +"quail", +"partridge", +"African grey, African gray, Psittacus erithacus", +"macaw", +"sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita", +"lorikeet", +"coucal", +"bee eater", +"hornbill", +"hummingbird", +"jacamar", +"toucan", +"drake", +"red-breasted merganser, Mergus serrator", +"goose", +"black swan, Cygnus atratus", +"tusker", +"echidna, spiny anteater, anteater", +"platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus", +"wallaby, brush kangaroo", +"koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus", +"wombat", +"jellyfish", +"sea anemone, anemone", +"brain coral", +"flatworm, platyhelminth", +"nematode, nematode worm, roundworm", +"conch", +"snail", +"slug", +"sea slug, nudibranch", +"chiton, coat-of-mail shell, sea cradle, polyplacophore", +"chambered nautilus, pearly nautilus, nautilus", +"Dungeness crab, Cancer magister", +"rock crab, Cancer irroratus", +"fiddler crab", +"king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica", +"American lobster, Northern lobster, Maine lobster, Homarus americanus", +"spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish", +"crayfish, crawfish, crawdad, crawdaddy", +"hermit crab", +"isopod", +"white stork, Ciconia ciconia", +"black stork, Ciconia nigra", +"spoonbill", +"flamingo", +"little blue heron, Egretta caerulea", +"American egret, great white heron, Egretta albus", +"bittern", +"crane", +"limpkin, Aramus pictus", +"European gallinule, Porphyrio porphyrio", +"American coot, marsh hen, mud hen, water hen, Fulica americana", +"bustard", +"ruddy turnstone, Arenaria interpres", +"red-backed sandpiper, dunlin, Erolia alpina", +"redshank, Tringa totanus", +"dowitcher", +"oystercatcher, oyster catcher", +"pelican", +"king penguin, Aptenodytes patagonica", +"albatross, mollymawk", +"grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus", +"killer whale, killer, orca, grampus, sea wolf, Orcinus orca", +"dugong, Dugong dugon", +"sea lion", +"Chihuahua", +"Japanese spaniel", +"Maltese dog, Maltese terrier, Maltese", +"Pekinese, Pekingese, Peke", +"Shih-Tzu", +"Blenheim spaniel", +"papillon", +"toy terrier", +"Rhodesian ridgeback", +"Afghan hound, Afghan", +"basset, basset hound", +"beagle", +"bloodhound, sleuthhound", +"bluetick", +"black-and-tan coonhound", +"Walker hound, Walker foxhound", +"English foxhound", +"redbone", +"borzoi, Russian wolfhound", +"Irish wolfhound", +"Italian greyhound", +"whippet", +"Ibizan hound, Ibizan Podenco", +"Norwegian elkhound, elkhound", +"otterhound, otter hound", +"Saluki, gazelle hound", +"Scottish deerhound, deerhound", +"Weimaraner", +"Staffordshire bullterrier, Staffordshire bull terrier", +"American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier", +"Bedlington terrier", +"Border terrier", +"Kerry blue terrier", +"Irish terrier", +"Norfolk terrier", +"Norwich terrier", +"Yorkshire terrier", +"wire-haired fox terrier", +"Lakeland terrier", +"Sealyham terrier, Sealyham", +"Airedale, Airedale terrier", +"cairn, cairn terrier", +"Australian terrier", +"Dandie Dinmont, Dandie Dinmont terrier", +"Boston bull, Boston terrier", +"miniature schnauzer", +"giant schnauzer", +"standard schnauzer", +"Scotch terrier, Scottish terrier, Scottie", +"Tibetan terrier, chrysanthemum dog", +"silky terrier, Sydney silky", +"soft-coated wheaten terrier", +"West Highland white terrier", +"Lhasa, Lhasa apso", +"flat-coated retriever", +"curly-coated retriever", +"golden retriever", +"Labrador retriever", +"Chesapeake Bay retriever", +"German short-haired pointer", +"vizsla, Hungarian pointer", +"English setter", +"Irish setter, red setter", +"Gordon setter", +"Brittany spaniel", +"clumber, clumber spaniel", +"English springer, English springer spaniel", +"Welsh springer spaniel", +"cocker spaniel, English cocker spaniel, cocker", +"Sussex spaniel", +"Irish water spaniel", +"kuvasz", +"schipperke", +"groenendael", +"malinois", +"briard", +"kelpie", +"komondor", +"Old English sheepdog, bobtail", +"Shetland sheepdog, Shetland sheep dog, Shetland", +"collie", +"Border collie", +"Bouvier des Flandres, Bouviers des Flandres", +"Rottweiler", +"German shepherd, German shepherd dog, German police dog, alsatian", +"Doberman, Doberman pinscher", +"miniature pinscher", +"Greater Swiss Mountain dog", +"Bernese mountain dog", +"Appenzeller", +"EntleBucher", +"boxer", +"bull mastiff", +"Tibetan mastiff", +"French bulldog", +"Great Dane", +"Saint Bernard, St Bernard", +"Eskimo dog, husky", +"malamute, malemute, Alaskan malamute", +"Siberian husky", +"dalmatian, coach dog, carriage dog", +"affenpinscher, monkey pinscher, monkey dog", +"basenji", +"pug, pug-dog", +"Leonberg", +"Newfoundland, Newfoundland dog", +"Great Pyrenees", +"Samoyed, Samoyede", +"Pomeranian", +"chow, chow chow", +"keeshond", +"Brabancon griffon", +"Pembroke, Pembroke Welsh corgi", +"Cardigan, Cardigan Welsh corgi", +"toy poodle", +"miniature poodle", +"standard poodle", +"Mexican hairless", +"timber wolf, grey wolf, gray wolf, Canis lupus", +"white wolf, Arctic wolf, Canis lupus tundrarum", +"red wolf, maned wolf, Canis rufus, Canis niger", +"coyote, prairie wolf, brush wolf, Canis latrans", +"dingo, warrigal, warragal, Canis dingo", +"dhole, Cuon alpinus", +"African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus", +"hyena, hyaena", +"red fox, Vulpes vulpes", +"kit fox, Vulpes macrotis", +"Arctic fox, white fox, Alopex lagopus", +"grey fox, gray fox, Urocyon cinereoargenteus", +"tabby, tabby cat", +"tiger cat", +"Persian cat", +"Siamese cat, Siamese", +"Egyptian cat", +"cougar, puma, catamount, mountain lion, painter, panther, Felis concolor", +"lynx, catamount", +"leopard, Panthera pardus", +"snow leopard, ounce, Panthera uncia", +"jaguar, panther, Panthera onca, Felis onca", +"lion, king of beasts, Panthera leo", +"tiger, Panthera tigris", +"cheetah, chetah, Acinonyx jubatus", +"brown bear, bruin, Ursus arctos", +"American black bear, black bear, Ursus americanus, Euarctos americanus", +"ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus", +"sloth bear, Melursus ursinus, Ursus ursinus", +"mongoose", +"meerkat, mierkat", +"tiger beetle", +"ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle", +"ground beetle, carabid beetle", +"long-horned beetle, longicorn, longicorn beetle", +"leaf beetle, chrysomelid", +"dung beetle", +"rhinoceros beetle", +"weevil", +"fly", +"bee", +"ant, emmet, pismire", +"grasshopper, hopper", +"cricket", +"walking stick, walkingstick, stick insect", +"cockroach, roach", +"mantis, mantid", +"cicada, cicala", +"leafhopper", +"lacewing, lacewing fly", +"dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk", +"damselfly", +"admiral", +"ringlet, ringlet butterfly", +"monarch, monarch butterfly, milkweed butterfly, Danaus plexippus", +"cabbage butterfly", +"sulphur butterfly, sulfur butterfly", +"lycaenid, lycaenid butterfly", +"starfish, sea star", +"sea urchin", +"sea cucumber, holothurian", +"wood rabbit, cottontail, cottontail rabbit", +"hare", +"Angora, Angora rabbit", +"hamster", +"porcupine, hedgehog", +"fox squirrel, eastern fox squirrel, Sciurus niger", +"marmot", +"beaver", +"guinea pig, Cavia cobaya", +"sorrel", +"zebra", +"hog, pig, grunter, squealer, Sus scrofa", +"wild boar, boar, Sus scrofa", +"warthog", +"hippopotamus, hippo, river horse, Hippopotamus amphibius", +"ox", +"water buffalo, water ox, Asiatic buffalo, Bubalus bubalis", +"bison", +"ram, tup", +"bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis", +"ibex, Capra ibex", +"hartebeest", +"impala, Aepyceros melampus", +"gazelle", +"Arabian camel, dromedary, Camelus dromedarius", +"llama", +"weasel", +"mink", +"polecat, fitch, foulmart, foumart, Mustela putorius", +"black-footed ferret, ferret, Mustela nigripes", +"otter", +"skunk, polecat, wood pussy", +"badger", +"armadillo", +"three-toed sloth, ai, Bradypus tridactylus", +"orangutan, orang, orangutang, Pongo pygmaeus", +"gorilla, Gorilla gorilla", +"chimpanzee, chimp, Pan troglodytes", +"gibbon, Hylobates lar", +"siamang, Hylobates syndactylus, Symphalangus syndactylus", +"guenon, guenon monkey", +"patas, hussar monkey, Erythrocebus patas", +"baboon", +"macaque", +"langur", +"colobus, colobus monkey", +"proboscis monkey, Nasalis larvatus", +"marmoset", +"capuchin, ringtail, Cebus capucinus", +"howler monkey, howler", +"titi, titi monkey", +"spider monkey, Ateles geoffroyi", +"squirrel monkey, Saimiri sciureus", +"Madagascar cat, ring-tailed lemur, Lemur catta", +"indri, indris, Indri indri, Indri brevicaudatus", +"Indian elephant, Elephas maximus", +"African elephant, Loxodonta africana", +"lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens", +"giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca", +"barracouta, snoek", +"eel", +"coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch", +"rock beauty, Holocanthus tricolor", +"anemone fish", +"sturgeon", +"gar, garfish, garpike, billfish, Lepisosteus osseus", +"lionfish", +"puffer, pufferfish, blowfish, globefish", +"abacus", +"abaya", +"academic gown, academic robe, judge's robe", +"accordion, piano accordion, squeeze box", +"acoustic guitar", +"aircraft carrier, carrier, flattop, attack aircraft carrier", +"airliner", +"airship, dirigible", +"altar", +"ambulance", +"amphibian, amphibious vehicle", +"analog clock", +"apiary, bee house", +"apron", +"ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin", +"assault rifle, assault gun", +"backpack, back pack, knapsack, packsack, rucksack, haversack", +"bakery, bakeshop, bakehouse", +"balance beam, beam", +"balloon", +"ballpoint, ballpoint pen, ballpen, Biro", +"Band Aid", +"banjo", +"bannister, banister, balustrade, balusters, handrail", +"barbell", +"barber chair", +"barbershop", +"barn", +"barometer", +"barrel, cask", +"barrow, garden cart, lawn cart, wheelbarrow", +"baseball", +"basketball", +"bassinet", +"bassoon", +"bathing cap, swimming cap", +"bath towel", +"bathtub, bathing tub, bath, tub", +"beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon", +"beacon, lighthouse, beacon light, pharos", +"beaker", +"bearskin, busby, shako", +"beer bottle", +"beer glass", +"bell cote, bell cot", +"bib", +"bicycle-built-for-two, tandem bicycle, tandem", +"bikini, two-piece", +"binder, ring-binder", +"binoculars, field glasses, opera glasses", +"birdhouse", +"boathouse", +"bobsled, bobsleigh, bob", +"bolo tie, bolo, bola tie, bola", +"bonnet, poke bonnet", +"bookcase", +"bookshop, bookstore, bookstall", +"bottlecap", +"bow", +"bow tie, bow-tie, bowtie", +"brass, memorial tablet, plaque", +"brassiere, bra, bandeau", +"breakwater, groin, groyne, mole, bulwark, seawall, jetty", +"breastplate, aegis, egis", +"broom", +"bucket, pail", +"buckle", +"bulletproof vest", +"bullet train, bullet", +"butcher shop, meat market", +"cab, hack, taxi, taxicab", +"caldron, cauldron", +"candle, taper, wax light", +"cannon", +"canoe", +"can opener, tin opener", +"cardigan", +"car mirror", +"carousel, carrousel, merry-go-round, roundabout, whirligig", +"carpenter's kit, tool kit", +"carton", +"car wheel", +"cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM", +"cassette", +"cassette player", +"castle", +"catamaran", +"CD player", +"cello, violoncello", +"cellular telephone, cellular phone, cellphone, cell, mobile phone", +"chain", +"chainlink fence", +"chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour", +"chain saw, chainsaw", +"chest", +"chiffonier, commode", +"chime, bell, gong", +"china cabinet, china closet", +"Christmas stocking", +"church, church building", +"cinema, movie theater, movie theatre, movie house, picture palace", +"cleaver, meat cleaver, chopper", +"cliff dwelling", +"cloak", +"clog, geta, patten, sabot", +"cocktail shaker", +"coffee mug", +"coffeepot", +"coil, spiral, volute, whorl, helix", +"combination lock", +"computer keyboard, keypad", +"confectionery, confectionary, candy store", +"container ship, containership, container vessel", +"convertible", +"corkscrew, bottle screw", +"cornet, horn, trumpet, trump", +"cowboy boot", +"cowboy hat, ten-gallon hat", +"cradle", +"crane", +"crash helmet", +"crate", +"crib, cot", +"Crock Pot", +"croquet ball", +"crutch", +"cuirass", +"dam, dike, dyke", +"desk", +"desktop computer", +"dial telephone, dial phone", +"diaper, nappy, napkin", +"digital clock", +"digital watch", +"dining table, board", +"dishrag, dishcloth", +"dishwasher, dish washer, dishwashing machine", +"disk brake, disc brake", +"dock, dockage, docking facility", +"dogsled, dog sled, dog sleigh", +"dome", +"doormat, welcome mat", +"drilling platform, offshore rig", +"drum, membranophone, tympan", +"drumstick", +"dumbbell", +"Dutch oven", +"electric fan, blower", +"electric guitar", +"electric locomotive", +"entertainment center", +"envelope", +"espresso maker", +"face powder", +"feather boa, boa", +"file, file cabinet, filing cabinet", +"fireboat", +"fire engine, fire truck", +"fire screen, fireguard", +"flagpole, flagstaff", +"flute, transverse flute", +"folding chair", +"football helmet", +"forklift", +"fountain", +"fountain pen", +"four-poster", +"freight car", +"French horn, horn", +"frying pan, frypan, skillet", +"fur coat", +"garbage truck, dustcart", +"gasmask, respirator, gas helmet", +"gas pump, gasoline pump, petrol pump, island dispenser", +"goblet", +"go-kart", +"golf ball", +"golfcart, golf cart", +"gondola", +"gong, tam-tam", +"gown", +"grand piano, grand", +"greenhouse, nursery, glasshouse", +"grille, radiator grille", +"grocery store, grocery, food market, market", +"guillotine", +"hair slide", +"hair spray", +"half track", +"hammer", +"hamper", +"hand blower, blow dryer, blow drier, hair dryer, hair drier", +"hand-held computer, hand-held microcomputer", +"handkerchief, hankie, hanky, hankey", +"hard disc, hard disk, fixed disk", +"harmonica, mouth organ, harp, mouth harp", +"harp", +"harvester, reaper", +"hatchet", +"holster", +"home theater, home theatre", +"honeycomb", +"hook, claw", +"hoopskirt, crinoline", +"horizontal bar, high bar", +"horse cart, horse-cart", +"hourglass", +"iPod", +"iron, smoothing iron", +"jack-o'-lantern", +"jean, blue jean, denim", +"jeep, landrover", +"jersey, T-shirt, tee shirt", +"jigsaw puzzle", +"jinrikisha, ricksha, rickshaw", +"joystick", +"kimono", +"knee pad", +"knot", +"lab coat, laboratory coat", +"ladle", +"lampshade, lamp shade", +"laptop, laptop computer", +"lawn mower, mower", +"lens cap, lens cover", +"letter opener, paper knife, paperknife", +"library", +"lifeboat", +"lighter, light, igniter, ignitor", +"limousine, limo", +"liner, ocean liner", +"lipstick, lip rouge", +"Loafer", +"lotion", +"loudspeaker, speaker, speaker unit, loudspeaker system, speaker system", +"loupe, jeweler's loupe", +"lumbermill, sawmill", +"magnetic compass", +"mailbag, postbag", +"mailbox, letter box", +"maillot", +"maillot, tank suit", +"manhole cover", +"maraca", +"marimba, xylophone", +"mask", +"matchstick", +"maypole", +"maze, labyrinth", +"measuring cup", +"medicine chest, medicine cabinet", +"megalith, megalithic structure", +"microphone, mike", +"microwave, microwave oven", +"military uniform", +"milk can", +"minibus", +"miniskirt, mini", +"minivan", +"missile", +"mitten", +"mixing bowl", +"mobile home, manufactured home", +"Model T", +"modem", +"monastery", +"monitor", +"moped", +"mortar", +"mortarboard", +"mosque", +"mosquito net", +"motor scooter, scooter", +"mountain bike, all-terrain bike, off-roader", +"mountain tent", +"mouse, computer mouse", +"mousetrap", +"moving van", +"muzzle", +"nail", +"neck brace", +"necklace", +"nipple", +"notebook, notebook computer", +"obelisk", +"oboe, hautboy, hautbois", +"ocarina, sweet potato", +"odometer, hodometer, mileometer, milometer", +"oil filter", +"organ, pipe organ", +"oscilloscope, scope, cathode-ray oscilloscope, CRO", +"overskirt", +"oxcart", +"oxygen mask", +"packet", +"paddle, boat paddle", +"paddlewheel, paddle wheel", +"padlock", +"paintbrush", +"pajama, pyjama, pj's, jammies", +"palace", +"panpipe, pandean pipe, syrinx", +"paper towel", +"parachute, chute", +"parallel bars, bars", +"park bench", +"parking meter", +"passenger car, coach, carriage", +"patio, terrace", +"pay-phone, pay-station", +"pedestal, plinth, footstall", +"pencil box, pencil case", +"pencil sharpener", +"perfume, essence", +"Petri dish", +"photocopier", +"pick, plectrum, plectron", +"pickelhaube", +"picket fence, paling", +"pickup, pickup truck", +"pier", +"piggy bank, penny bank", +"pill bottle", +"pillow", +"ping-pong ball", +"pinwheel", +"pirate, pirate ship", +"pitcher, ewer", +"plane, carpenter's plane, woodworking plane", +"planetarium", +"plastic bag", +"plate rack", +"plow, plough", +"plunger, plumber's helper", +"Polaroid camera, Polaroid Land camera", +"pole", +"police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria", +"poncho", +"pool table, billiard table, snooker table", +"pop bottle, soda bottle", +"pot, flowerpot", +"potter's wheel", +"power drill", +"prayer rug, prayer mat", +"printer", +"prison, prison house", +"projectile, missile", +"projector", +"puck, hockey puck", +"punching bag, punch bag, punching ball, punchball", +"purse", +"quill, quill pen", +"quilt, comforter, comfort, puff", +"racer, race car, racing car", +"racket, racquet", +"radiator", +"radio, wireless", +"radio telescope, radio reflector", +"rain barrel", +"recreational vehicle, RV, R.V.", +"reel", +"reflex camera", +"refrigerator, icebox", +"remote control, remote", +"restaurant, eating house, eating place, eatery", +"revolver, six-gun, six-shooter", +"rifle", +"rocking chair, rocker", +"rotisserie", +"rubber eraser, rubber, pencil eraser", +"rugby ball", +"rule, ruler", +"running shoe", +"safe", +"safety pin", +"saltshaker, salt shaker", +"sandal", +"sarong", +"sax, saxophone", +"scabbard", +"scale, weighing machine", +"school bus", +"schooner", +"scoreboard", +"screen, CRT screen", +"screw", +"screwdriver", +"seat belt, seatbelt", +"sewing machine", +"shield, buckler", +"shoe shop, shoe-shop, shoe store", +"shoji", +"shopping basket", +"shopping cart", +"shovel", +"shower cap", +"shower curtain", +"ski", +"ski mask", +"sleeping bag", +"slide rule, slipstick", +"sliding door", +"slot, one-armed bandit", +"snorkel", +"snowmobile", +"snowplow, snowplough", +"soap dispenser", +"soccer ball", +"sock", +"solar dish, solar collector, solar furnace", +"sombrero", +"soup bowl", +"space bar", +"space heater", +"space shuttle", +"spatula", +"speedboat", +"spider web, spider's web", +"spindle", +"sports car, sport car", +"spotlight, spot", +"stage", +"steam locomotive", +"steel arch bridge", +"steel drum", +"stethoscope", +"stole", +"stone wall", +"stopwatch, stop watch", +"stove", +"strainer", +"streetcar, tram, tramcar, trolley, trolley car", +"stretcher", +"studio couch, day bed", +"stupa, tope", +"submarine, pigboat, sub, U-boat", +"suit, suit of clothes", +"sundial", +"sunglass", +"sunglasses, dark glasses, shades", +"sunscreen, sunblock, sun blocker", +"suspension bridge", +"swab, swob, mop", +"sweatshirt", +"swimming trunks, bathing trunks", +"swing", +"switch, electric switch, electrical switch", +"syringe", +"table lamp", +"tank, army tank, armored combat vehicle, armoured combat vehicle", +"tape player", +"teapot", +"teddy, teddy bear", +"television, television system", +"tennis ball", +"thatch, thatched roof", +"theater curtain, theatre curtain", +"thimble", +"thresher, thrasher, threshing machine", +"throne", +"tile roof", +"toaster", +"tobacco shop, tobacconist shop, tobacconist", +"toilet seat", +"torch", +"totem pole", +"tow truck, tow car, wrecker", +"toyshop", +"tractor", +"trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi", +"tray", +"trench coat", +"tricycle, trike, velocipede", +"trimaran", +"tripod", +"triumphal arch", +"trolleybus, trolley coach, trackless trolley", +"trombone", +"tub, vat", +"turnstile", +"typewriter keyboard", +"umbrella", +"unicycle, monocycle", +"upright, upright piano", +"vacuum, vacuum cleaner", +"vase", +"vault", +"velvet", +"vending machine", +"vestment", +"viaduct", +"violin, fiddle", +"volleyball", +"waffle iron", +"wall clock", +"wallet, billfold, notecase, pocketbook", +"wardrobe, closet, press", +"warplane, military plane", +"washbasin, handbasin, washbowl, lavabo, wash-hand basin", +"washer, automatic washer, washing machine", +"water bottle", +"water jug", +"water tower", +"whiskey jug", +"whistle", +"wig", +"window screen", +"window shade", +"Windsor tie", +"wine bottle", +"wing", +"wok", +"wooden spoon", +"wool, woolen, woollen", +"worm fence, snake fence, snake-rail fence, Virginia fence", +"wreck", +"yawl", +"yurt", +"web site, website, internet site, site", +"comic book", +"crossword puzzle, crossword", +"street sign", +"traffic light, traffic signal, stoplight", +"book jacket, dust cover, dust jacket, dust wrapper", +"menu", +"plate", +"guacamole", +"consomme", +"hot pot, hotpot", +"trifle", +"ice cream, icecream", +"ice lolly, lolly, lollipop, popsicle", +"French loaf", +"bagel, beigel", +"pretzel", +"cheeseburger", +"hotdog, hot dog, red hot", +"mashed potato", +"head cabbage", +"broccoli", +"cauliflower", +"zucchini, courgette", +"spaghetti squash", +"acorn squash", +"butternut squash", +"cucumber, cuke", +"artichoke, globe artichoke", +"bell pepper", +"cardoon", +"mushroom", +"Granny Smith", +"strawberry", +"orange", +"lemon", +"fig", +"pineapple, ananas", +"banana", +"jackfruit, jak, jack", +"custard apple", +"pomegranate", +"hay", +"carbonara", +"chocolate sauce, chocolate syrup", +"dough", +"meat loaf, meatloaf", +"pizza, pizza pie", +"potpie", +"burrito", +"red wine", +"espresso", +"cup", +"eggnog", +"alp", +"bubble", +"cliff, drop, drop-off", +"coral reef", +"geyser", +"lakeside, lakeshore", +"promontory, headland, head, foreland", +"sandbar, sand bar", +"seashore, coast, seacoast, sea-coast", +"valley, vale", +"volcano", +"ballplayer, baseball player", +"groom, bridegroom", +"scuba diver", +"rapeseed", +"daisy", +"yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum", +"corn", +"acorn", +"hip, rose hip, rosehip", +"buckeye, horse chestnut, conker", +"coral fungus", +"agaric", +"gyromitra", +"stinkhorn, carrion fungus", +"earthstar", +"hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa", +"bolete", +"ear, spike, capitulum", +"toilet tissue, toilet paper, bathroom tissue", +}; diff --git a/libraries/KPU/examples/mobilenet_v1/names.h b/libraries/KPU/examples/mobilenet_v1/names.h new file mode 100644 index 0000000..0a61ad1 --- /dev/null +++ b/libraries/KPU/examples/mobilenet_v1/names.h @@ -0,0 +1,7 @@ +#ifndef __MBNET_NAMES_H +#define __MBNET_NAMES_H + +extern const char* mbnet_label_name[]; + +#endif + diff --git a/libraries/KPU/keywords.txt b/libraries/KPU/keywords.txt new file mode 100644 index 0000000..e6d315e --- /dev/null +++ b/libraries/KPU/keywords.txt @@ -0,0 +1,26 @@ +####################################### +# Syntax Coloring Map SD +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +KPUClass KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +begin KEYWORD2 +end KEYWORD2 +forward KEYWORD2 +isForwardOk KEYWORD2 +getResult KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### +KPU_ERROR_BUSY LITERAL1 +KPU_ERROR_BAD_MODEL LITERAL1 +KPU_ERROR_MODEL_VERSION LITERAL1 +KPU_ERROR_NONE LITERAL1 diff --git a/libraries/KPU/library.properties b/libraries/KPU/library.properties new file mode 100644 index 0000000..abe87f7 --- /dev/null +++ b/libraries/KPU/library.properties @@ -0,0 +1,9 @@ +name=KPU +version=1.0.0 +author= Neucrack Sipeed +maintainer=Sipeed +sentence=KPU API of k210 +paragraph=KPU API of k210 +category=Other +url= +architectures=k210 diff --git a/libraries/KPU/src/KPU.cpp b/libraries/KPU/src/KPU.cpp new file mode 100644 index 0000000..bf507a1 --- /dev/null +++ b/libraries/KPU/src/KPU.cpp @@ -0,0 +1,74 @@ + + +#include "KPU.h" +#include "sysctl.h" + + +#define AI_STATUS_IDLE 0 +#define AI_STATUS_BUSY 1 +#define AI_STATUS_OK 2 + + +static volatile uint32_t g_ai_done_flag = AI_STATUS_IDLE; + +KPUClass::KPUClass() +:_flagGotResult(true) +{ + +} + +KPUClass::~KPUClass() +{ + end(); +} + +int KPUClass::begin(uint8_t* model) +{ + sysctl_clock_enable(SYSCTL_CLOCK_AI); + if (kpu_load_kmodel(&_task, model) != 0) + return KPU_ERROR_BAD_MODEL; + return KPU_ERROR_NONE; +} + +void KPUClass::end() +{ + sysctl_clock_disable(SYSCTL_CLOCK_AI); +} + +extern "C" { + static void ai_done(void* userdata) + { + bool* user_used = (bool*)userdata; + g_ai_done_flag = AI_STATUS_OK; + *user_used = false; + } +} + +int KPUClass::forward(uint8_t* imgSrc, uint8_t dmaCh) +{ + if(g_ai_done_flag == AI_STATUS_BUSY) + return KPU_ERROR_BUSY; + g_ai_done_flag = AI_STATUS_BUSY; + if (kpu_run_kmodel(&_task, imgSrc, (dmac_channel_number_t)dmaCh, ai_done, (void*)&_flagGotResult) != 0) + { + g_ai_done_flag = AI_STATUS_IDLE; + return KPU_ERROR_BAD_MODEL; + } + return KPU_ERROR_NONE; +} + +bool KPUClass::isForwardOk() +{ + return g_ai_done_flag==AI_STATUS_OK; +} + +int KPUClass::getResult(uint8_t**data, size_t* count, uint32_t startIndex ) +{ + _flagGotResult = true; + kpu_get_output(&_task, startIndex, data, count); + return KPU_ERROR_NONE; +} + + + + diff --git a/libraries/KPU/src/KPU.h b/libraries/KPU/src/KPU.h new file mode 100644 index 0000000..8ab2a42 --- /dev/null +++ b/libraries/KPU/src/KPU.h @@ -0,0 +1,42 @@ + +#ifndef __MOBILENET_V1_H +#define __MOBILENET_V1_H + +extern "C" { +#include "kpu.h" +} + +typedef enum{ + KPU_ERROR_BUSY = -3, + KPU_ERROR_BAD_MODEL = -2, + KPU_ERROR_MODEL_VERSION = -1, + KPU_ERROR_NONE = 0, +} KPU_Error_t; + + +class KPUClass{ + +public: + KPUClass(); + ~KPUClass(); + int begin(uint8_t* model); + void end(); + /** + * @param imgSrc RGB888 image source + * @param dmaCh [0,5) + */ + int forward(uint8_t* imgSrc, uint8_t dmaCh=0); + bool isForwardOk(); + int getResult(uint8_t**data, size_t* count, uint32_t startIndex = 0); + + +private: + kpu_model_context_t _task; + bool _flagGotResult; + + +}; + + +#endif + diff --git a/libraries/SD/src/File.cpp b/libraries/SD/src/File.cpp index 20d9f70..eab6ab7 100644 --- a/libraries/SD/src/File.cpp +++ b/libraries/SD/src/File.cpp @@ -95,6 +95,22 @@ int File::read(void *buf, uint16_t nbyte) { return 0; } +long File::read(void *buf, uint32_t nbyte) { + if (!_file) + return 0; + uint32_t bytesToRead = nbyte; + uint16_t ret, readBytesOnece; + while(bytesToRead) + { + readBytesOnece = (bytesToRead>65000) ? 65000 : bytesToRead; + ret = (uint16_t)_file->read(buf+(nbyte-bytesToRead), readBytesOnece); + if(ret == 0xffff) + return -1; + bytesToRead -= ret; + } + return nbyte; +} + int File::available() { if (! _file) return 0; diff --git a/libraries/SD/src/SD.h b/libraries/SD/src/SD.h index b0ae4fd..14eafa4 100644 --- a/libraries/SD/src/SD.h +++ b/libraries/SD/src/SD.h @@ -40,6 +40,7 @@ public: virtual int available(); virtual void flush(); int read(void *buf, uint16_t nbyte); + long read(void *buf, uint32_t nbyte); boolean seek(uint32_t pos); uint32_t position(); uint32_t size(); diff --git a/libraries/Sipeed_OV2640/src/Sipeed_OV2640.cpp b/libraries/Sipeed_OV2640/src/Sipeed_OV2640.cpp index 618f6c6..f784e82 100644 --- a/libraries/Sipeed_OV2640/src/Sipeed_OV2640.cpp +++ b/libraries/Sipeed_OV2640/src/Sipeed_OV2640.cpp @@ -606,6 +606,19 @@ _id(0) configASSERT(pixFormat == PIXFORMAT_RGB565 || pixFormat==PIXFORMAT_YUV422); } + + +Sipeed_OV2640::Sipeed_OV2640(uint16_t width, uint16_t height, pixformat_t pixFormat) +:Camera(width, height, pixFormat), +_dataBuffer(NULL), _aiBuffer(NULL), +_resetPoliraty(ACTIVE_HIGH), _pwdnPoliraty(ACTIVE_HIGH), +_slaveAddr(0x00), +_id(0) +{ + configASSERT(pixFormat == PIXFORMAT_RGB565 || pixFormat==PIXFORMAT_YUV422); +} + + Sipeed_OV2640::~Sipeed_OV2640() { end(); diff --git a/libraries/Sipeed_OV2640/src/Sipeed_OV2640.h b/libraries/Sipeed_OV2640/src/Sipeed_OV2640.h index a52b876..e7541d4 100644 --- a/libraries/Sipeed_OV2640/src/Sipeed_OV2640.h +++ b/libraries/Sipeed_OV2640/src/Sipeed_OV2640.h @@ -37,6 +37,7 @@ class Sipeed_OV2640 : public Camera{ public: Sipeed_OV2640(framesize_t frameSize = FRAMESIZE_QVGA, pixformat_t pixFormat = PIXFORMAT_RGB565); + Sipeed_OV2640(uint16_t width, uint16_t height, pixformat_t pixFormat = PIXFORMAT_RGB565); ~Sipeed_OV2640(); virtual bool begin(); @@ -51,6 +52,8 @@ public: * If pixels format is RGB565: return RGB565 pixels with every uint16_t one pixel, e.g. RED: 0xF800 */ virtual uint8_t* snapshot(); + virtual uint16_t* getRGB565(){ return (uint16_t*)_dataBuffer; }; + virtual uint8_t* getRGB888(){ return _aiBuffer; }; virtual void setRotaion(uint8_t rotation); virtual void setInvert(bool invert); diff --git a/libraries/Sipeed_ST7789/src/lcd.c b/libraries/Sipeed_ST7789/src/lcd.c index 9faaf1b..cdea5a5 100644 --- a/libraries/Sipeed_ST7789/src/lcd.c +++ b/libraries/Sipeed_ST7789/src/lcd.c @@ -174,7 +174,7 @@ void lcd_set_area(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) void lcd_draw_point(uint16_t x, uint16_t y, uint16_t color) { lcd_set_area(x, y, x, y); - tft_write_byte((uint8_t*)&color, 2); + tft_write_half(&color, 1); } void lcd_clear(uint16_t color) @@ -204,13 +204,13 @@ void lcd_draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint *p++ = data; lcd_set_area(x1, y1, x2, y1 + width - 1); - tft_write_byte((uint8_t*)data_buf, ((x2 - x1 + 1) * width + 1) * 2); + tft_write_word(data_buf, ((x2 - x1 + 1) * width + 1) / 2); lcd_set_area(x1, y2 - width + 1, x2, y2); - tft_write_byte((uint8_t*)data_buf, ((x2 - x1 + 1) * width + 1) * 2); + tft_write_word(data_buf, ((x2 - x1 + 1) * width + 1) / 2); lcd_set_area(x1, y1, x1 + width - 1, y2); - tft_write_byte((uint8_t*)data_buf, ((y2 - y1 + 1) * width + 1) * 2); + tft_write_word(data_buf, ((y2 - y1 + 1) * width + 1) / 2); lcd_set_area(x2 - width + 1, y1, x2, y2); - tft_write_byte((uint8_t*)data_buf, ((y2 - y1 + 1) * width + 1) * 2); + tft_write_word(data_buf, ((y2 - y1 + 1) * width + 1) / 2); } #define SWAP_16(x) ((x >> 8 & 0xff) | (x << 8)) diff --git a/libraries/Sipeed_ST7789/src/st7789.c b/libraries/Sipeed_ST7789/src/st7789.c index 26c6faa..a77d2a8 100644 --- a/libraries/Sipeed_ST7789/src/st7789.c +++ b/libraries/Sipeed_ST7789/src/st7789.c @@ -73,7 +73,7 @@ void tft_write_byte(uint8_t *data_buf, uint32_t length) { set_dcx_data(); spi_init(g_spi_num, SPI_WORK_MODE_0, SPI_FF_OCTAL, 8, 0); - spi_init_non_standard(g_spi_num, 0 /*instrction length*/, 8 /*address length*/, 0 /*wait cycles*/, + spi_init_non_standard(g_spi_num, 8 /*instrction length*/, 0 /*address length*/, 0 /*wait cycles*/, SPI_AITM_AS_FRAME_FORMAT /*spi address trans mode*/); spi_send_data_normal_dma(g_dma_ch, g_spi_num, g_ss, data_buf, length, SPI_TRANS_CHAR); } @@ -82,7 +82,7 @@ void tft_write_half(uint16_t *data_buf, uint32_t length) { set_dcx_data(); spi_init(g_spi_num, SPI_WORK_MODE_0, SPI_FF_OCTAL, 16, 0); - spi_init_non_standard(g_spi_num, 0 /*instrction length*/, 16 /*address length*/, 0 /*wait cycles*/, + spi_init_non_standard(g_spi_num, 16 /*instrction length*/, 0 /*address length*/, 0 /*wait cycles*/, SPI_AITM_AS_FRAME_FORMAT /*spi address trans mode*/); spi_send_data_normal_dma(g_dma_ch, g_spi_num, g_ss, data_buf, length, SPI_TRANS_SHORT); }