Ribster Posted January 7, 2017 Posted January 7, 2017 Hey everybody. I'm quite new to allwinner, my first experience was with the A13 (sun4i) from olimex. I wrote a kernel driver for the sunxi kernel, which uses the spi and some GPIO. It talks to an SPI RF chip and works just fine. I want to port my kernel driver for the Orange Pi Zero, but have some issues. My main question is: how do i access the fex file, how do i manipulate the gpio and spi ? In the sun4i there are helper functions in the arch/arm/mach-sun4i/sys_config.c file. #define PIN_DIR(handler,dir) gpio_set_one_pin_io_status(handler, dir, NULL) #define PIN_SET(handler,val) gpio_write_one_pin_value(handler, val, NULL) #define PIN_GET(handler) gpio_read_one_pin_value(handler, NULL) I don't seem to get them in the sun8i sys_config.c file that is located in #include <mach/sys_config.h> I normally get the gpio pins as such: my_sx1272_data->pin_led = gpio_request_ex("sx1272_para", "pin_led"); And i manipulate the IO with these defines, that also use the functions from sys_config. PIN_DIR(my_sx1272_data->pin_led, PIN_DIR_OUT); PIN_SET(my_sx1272_data->pin_led, 0); For the SPI i use this way of setup, i guess this will work, but i need to get rid of the sys_config implicit function compilation error first. struct spi_board_info spi_device_info = { .modalias = "DURALINK", .max_speed_hz = 350*1000, //speed your device (slave) can handle .bus_num = 2, .chip_select = 0, .mode = 0, }; master = spi_busnum_to_master( spi_device_info.bus_num ); if( !master ){ printk(KERN_ERR "[LoRa] MASTER not found.\n"); return -ENODEV; } // create a new slave device, given the master and device info spi_device = spi_new_device( master, &spi_device_info ); if( !spi_device ) { printk(KERN_ERR "[LoRa] FAILED to create slave.\n"); return -ENODEV; } spi_device->bits_per_word = 8; ret = spi_setup( spi_device ); if( ret ){ printk(KERN_ERR "[LoRa] FAILED to setup slave.\n"); spi_unregister_device( spi_device ); return -ENODEV; } Currently using Linux OPI-3.4.113 3.4.113-sun8i #50 SMP PREEMPT Mon Nov 14 08:41:55 CET 2016 armv7l GNU/Linux So it's the Debian armbian image 3.4.113. Thanks in advance.
Ribster Posted January 7, 2017 Author Posted January 7, 2017 Update: I found out that the pyA20 library has some interfacing stuff that can be used. Investigating this to get it build in c with gcc so i can make some leds blink. https://github.com/duxingkei33/orangepi_PC_gpio_pyH3
martinayotte Posted January 7, 2017 Posted January 7, 2017 Right ! That is the lib to use for python, but internals C function can also be copied/pasted to any C program. 1
Ribster Posted January 7, 2017 Author Posted January 7, 2017 Yes, i've got the python blinky sketch working. Changed the mapping.h for the correct io and was up and running. i've tried a simple c file, but i've got some errors. Once i get this up and running, i can port it to my kernel module... my test.c #include <stdlib.h> #include <stdio.h> #include "gpio_lib.h" sunxi_gpio_init(); sunxi_gpio_set_cfgpin(SUNXI_GPA(17), SUNXI_GPIO_OUTPUT); while(1) { sunxi_gpio_output(SUNXI_GPA(17), 1); sleep(1); sunxi_gpio_output(SUNXI_GPA(17), 0); sleep(1); } and the shell output root@OPI-3:~/git/orangepi_PC_gpio_pyH3/pyA20/gpio# gcc -O test.c test.c:5:1: warning: data definition has no type or storage class sunxi_gpio_init(); ^ In file included from test.c:3:0: gpio_lib.h:122:24: error: expected declaration specifiers or ‘...’ before ‘(’ token #define SUNXI_GPA(_nr) (SUNXI_GPIO_A_START + (_nr)) ^ test.c:6:23: note: in expansion of macro ‘SUNXI_GPA’ sunxi_gpio_set_cfgpin(SUNXI_GPA(17), SUNXI_GPIO_OUTPUT); ^ gpio_lib.h:143:27: error: expected declaration specifiers or ‘...’ before ‘(’ token #define SUNXI_GPIO_OUTPUT (1) ^ test.c:6:38: note: in expansion of macro ‘SUNXI_GPIO_OUTPUT’ sunxi_gpio_set_cfgpin(SUNXI_GPA(17), SUNXI_GPIO_OUTPUT); ^ test.c:7:1: error: expected identifier or ‘(’ before ‘while’ while(1) { ^
Ribster Posted January 7, 2017 Author Posted January 7, 2017 So i'm stupid as fuck... Why did i not add the main function.... Got it working! For future reference: test.c file: #include <stdlib.h> #include <stdio.h> #include <time.h> #include "gpio_lib.h" int main(){ int ret; ret = sunxi_gpio_init(); ret = sunxi_gpio_set_cfgpin(SUNXI_GPA(17), SUNXI_GPIO_OUTPUT); while(1) { sunxi_gpio_output(SUNXI_GPA(17), 1); usleep(100000); sunxi_gpio_output(SUNXI_GPA(17), 0); usleep(100000); sunxi_gpio_output(SUNXI_GPA(17), 1); usleep(100000); sunxi_gpio_output(SUNXI_GPA(17), 0); usleep(600000); } } the command line compile: gcc test.c gpio_lib.c -o test Then just ./test and the red led will blink!! Next step: get this working in the kernel driver...
Peter Valencic Posted June 2, 2017 Posted June 2, 2017 Hi, I need to connect this kind of board over SPI bus to Orange PI: http://www.instructables.com/id/SPI-to-4-x-UART-Bridge-MULTIUART/ Can I use the https://github.com/duxingkei33/orangepi_PC_gpio_pyH3 libraries to talk over SPI bus? regards Peter
martinayotte Posted June 2, 2017 Posted June 2, 2017 Of course, but this board isn't supported by kernels, so your app will have to take care of it. If you wish that the kernel provide direct driver connection into /dev/ttyXXX, maybe you should use boards that are using SC16IS752.
Peter Valencic Posted June 3, 2017 Posted June 3, 2017 I found the implementation here (It's for arduino but should work also on orangepi with some modifications): https://github.com/RowlandTechnology/MULTIUART or maybe to use MAX14830 (https://www.maximintegrated.com/en/products/interface/controllers-expanders/MAX14830.html) 4 uarts to SPI http://www.spinics.net/lists/linux-serial/msg10232.html I'm working on scientific project where we must acquire datas over 5 uarts. Each uart is connected to specific sensor (oxygen, temp, salinity, pressure, chlorophile,..)..
martinayotte Posted June 3, 2017 Posted June 3, 2017 For the Arduino code, yes, this could help, but it is not handled as a kernel driver, so don't expect it to bee seen as /dev/ttyXXX. For the MAX14830, yes, mainline kernel is already supporting it, so it should be straight-forward ...
Peter Valencic Posted July 11, 2017 Posted July 11, 2017 Hi, need some help.. I'am familar with Java but with c/c++ not So.. have downloaded source from: https://github.com/duxingkei33/orangepi_PC_gpio_pyH3 to my orangepi.. Than I have installed the library with python and all is ok.. On the remote PC I have setup Netbeans IDE and now want to include gpio_lib.h The problem is that IDE can't find header files in directories listed below... So.. what is the procedure to use orangepi_PC_gpio_pyH3 library? Can I only copy/paste files to /usr/include folder on my OP?
martinayotte Posted July 11, 2017 Posted July 11, 2017 This "gpio_lib.h" is itself part of the library. https://github.com/duxingkei33/orangepi_PC_gpio_pyH3/blob/master/pyA20/gpio/gpio_lib.h So, you LIB_PATH should include the path to that directory, usually with plain Makefiles, it is "-I ."
Recommended Posts