This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

PROCESSOR-SDK-AM335X: SPI TEST

Part Number: PROCESSOR-SDK-AM335X

Here I am attaching my SPI Test program in C. The problem with this code is, when I run this code, it is printing TX data bytes on console but not RX data bytes. Can anyone say what's wrong with my code?

Anyone please check my code and suggest me the changes required to make it work for both reading and writing to SPI.

/*
 * SPI testing utility (using spidev driver)
 *
 * Copyright (c) 2007  MontaVista Software, Inc.
 * Copyright (c) 2007  Anton Vorontsov <avorontsov@ru.mvista.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License.
 *
 * Cross-compile with cross-gcc -I/path/to/cross-kernel/include
 */

#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.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 ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

static void pabort(const char *s)
{
	perror(s);
	abort();
}

uint8_t default_tx[] = {
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
	0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
	0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
	//0xF0, 0x0D,
};

static const char *device = "/dev/spidev0.0";
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=1;
static int transfer_size = sizeof(default_tx);
static int iterations;
static int interval = 5; /* interval in seconds for showing transfer rate */



uint8_t default_rx[ARRAY_SIZE(default_tx)] = {0, };
char *input_tx;

static void hex_dump(const void *src, size_t length, size_t line_size,
		     char *prefix)
{
	//printf("Entered HEX_DUMP()\n");
	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(" | ");  /* right close */
			while (line < address) {
				c = *line++;
				printf("%c", (c < 33 || c == 255) ? 0x2E : c);
			}
			printf("\n");
			if (length > 0)
				printf("%s | ", prefix);
		}
	}
	//printf("Exiting HEX_DUMP()\n");
}

/*
 *  Unescape - process hexadecimal escape character
 *      converts shell input "\x23" -> 0x23
 */
static int unescape(char *_dst, char *_src, size_t len)
{
	printf("Entered unescape()\n");
	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++;
	}
	printf("Exiting unescape()\n");
	return ret;
}

static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
{
	printf("Entered Transfer()\n");
	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,
	};
	//printf("Transfer()\n\tMode: %d\tSPI_TX_QUAD: %d\tSPI_TX_DUAL: %d\n",mode,SPI_TX_QUAD,SPI_TX_DUAL);
	if (mode & SPI_TX_QUAD)
		tr.tx_nbits = 4;
	else if (mode & SPI_TX_DUAL)
		tr.tx_nbits = 2;
	//printf("Transfer()\n\tMode: %d\tSPI_RX_QUAD: %d\tSPI_RX_DUAL: %d\n",mode,SPI_RX_QUAD,SPI_RX_DUAL);
	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_QUAD | SPI_TX_DUAL))
			tr.rx_buf = 0;
		else if (mode & (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");

	//printf("Transfer()\n\tVerbose: %d\toutput_file: %d",verbose,output_file);
	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");
	printf("Exited Transfer()\n");
}

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"
	     "  -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' },
			{ "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:lHOLC3NR24p: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 'S':
			transfer_size = atoi(optarg);
			break;
		case 'I':
			iterations = atoi(optarg);
			break;
		default:
			print_usage(argv[0]);
			break;
		}
	}
	if (mode & SPI_LOOP) {
		if (mode & SPI_TX_DUAL)
			mode |= SPI_RX_DUAL;
		if (mode & SPI_TX_QUAD)
			mode |= SPI_RX_QUAD;
	}
}

static void transfer_escaped_string(int fd, char *str)
{
	printf("Entered transfer_escaped_string()\n");
	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);
	//printf("Entering transfer() from transfer_escaped_string\n");
	transfer(fd, tx, rx, size);
	//printf("Exited transfer() in transfer_escaped_string\n");
	free(rx);
	free(tx);
	//printf("Exited transfer_escaped_string()\n");
}

static void transfer_file(int fd, char *filename)
{
	//printf("Entered transfer_file()\n");
	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");
	//printf("Calling transfer() from transfer_file\n");
	transfer(fd, tx, rx, sb.st_size);
	//printf("Came back from transfer(). Now in transfer_file\n");
	free(rx);
	free(tx);
	close(tx_fd);
	//printf("Exiting transfer_file()\n");
}

static uint64_t _read_count;
static uint64_t _write_count;

static void show_transfer_rate(void)
{
	//printf("in show_transfer_rate()\n");
	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;
	//printf("Exiting show_transfer_rate()\n");
}

static void transfer_buf(int fd, int len)
{
	//printf("Entered transfer_buf()\n");
	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);
	//printf("Exiting transfer_buf()\n");
}

int main(int argc, char *argv[])
{
	int ret = 0;
	int fd;

	parse_opts(argc, argv);

	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: %d\n", bits);
	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);

	if (input_tx && input_file)
		pabort("only one of -p and --input may be selected");

	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, &current);
			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
		//printf("Calling transfer()\n");
		transfer(fd, default_tx, default_rx, sizeof(default_tx));
		//printf("After transfer()\n");

	close(fd);

	return ret;
}

  • Hi Vamsi,

    Do you use AM335x TI PSDK Linux? If yes, which version?

    Do you use AM335x TI board or custom board?

    Can you attach your main DTS file for review? Please attach also your console output when running SPI test.

    Regards,
    Pavel

  • Q.  Do you use AM335x TI PSDK Linux? If yes, which version?

    A.  ti-processor-sdk-linux-am335x-evm-05.00.00.15



    Q.  Do you use AM335x TI board or custom board?

    A.  Custom board



    Q.  Can you attach your main DTS file for review? Please attach also your console output when running SPI test.

    A.  I've attached my dts file.Right now i dont have my bord with me. so i am unable to send it.

    /*
     * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License version 2 as
     * published by the Free Software Foundation.
     */
    /dts-v1/;
    
    #include "am33xx.dtsi"
    #include <dt-bindings/interrupt-controller/irq.h>
    
    / {
    	model = "TI AM335x EVM";
    	compatible = "ti,am335x-evm", "ti,am33xx";
    
    	cpus {
    		cpu@0 {
    			cpu0-supply = <&vdd1_reg>;
    		};
    	};
    
    	memory@80000000 {
    		device_type = "memory";
    		reg = <0x80000000 0x10000000>; /* 256 MB */
    	};
    
    	chosen {
    		stdout-path = &uart0;
    	};
    
    	vbat: fixedregulator0 {
    		compatible = "regulator-fixed";
    		regulator-name = "vbat";
    		regulator-min-microvolt = <5000000>;
    		regulator-max-microvolt = <5000000>;
    		regulator-boot-on;
    	};
    
    	lis3_reg: fixedregulator1 {
    		compatible = "regulator-fixed";
    		regulator-name = "lis3_reg";
    		regulator-boot-on;
    	};
    
    	wlan_en_reg: fixedregulator2 {
    		compatible = "regulator-fixed";
    		regulator-name = "wlan-en-regulator";
    		regulator-min-microvolt = <1800000>;
    		regulator-max-microvolt = <1800000>;
    
    		/* WLAN_EN GPIO for this board - Bank1, pin16 */
    		//gpio = <&gpio1 16 0>;
    
    		/* WLAN card specific delay */
    		startup-delay-us = <70000>;
    		enable-active-high;
    	};
    
    	
    	
    
    	
    
    };
    
    &am33xx_pinmux {
    	pinctrl-names = "default";
    	//pinctrl-0 = <&matrix_keypad_s0 &volume_keys_s0 &clkout2_pin>;
    
    	//matrix_keypad_s0: matrix_keypad_s0 {
    	//	pinctrl-single,pins = <
    	//	AM33XX_IOPAD(0x854, PIN_OUTPUT_PULLDOWN | MUX_MODE7)	/* gpmc_a5.gpio1_21 */
    	//		AM33XX_IOPAD(0x858, PIN_OUTPUT_PULLDOWN | MUX_MODE7)	/* gpmc_a6.gpio1_22 */
    	//		AM33XX_IOPAD(0x864, PIN_INPUT_PULLDOWN | MUX_MODE7)	/* gpmc_a9.gpio1_25 */
    	//		AM33XX_IOPAD(0x868, PIN_INPUT_PULLDOWN | MUX_MODE7)	/* gpmc_a10.gpio1_26 */
    	//		AM33XX_IOPAD(0x86c, PIN_INPUT_PULLDOWN | MUX_MODE7)	/* gpmc_a11.gpio1_27 */
    	//	>;
    	//};
    
    	//volume_keys_s0: volume_keys_s0 {
    	//	pinctrl-single,pins = <
    	//		AM33XX_IOPAD(0x950, PIN_INPUT_PULLDOWN | MUX_MODE7)	/* spi0_sclk.gpio0_2 */
    	//		AM33XX_IOPAD(0x954, PIN_INPUT_PULLDOWN | MUX_MODE7)	/* spi0_d0.gpio0_3 */
    	//	>;
    	//};
    
    
    	spi0_pins: spi0_pins {
    		pinctrl-single,pins = <
    			AM33XX_IOPAD(0x950, PIN_OUTPUT | MUX_MODE0)	/* spi0_sclk.spi0_sclk */
    			AM33XX_IOPAD(0x954, PIN_OUTPUT_PULLUP | MUX_MODE0)	/* spi0_d0.spi0_d0 */
    			AM33XX_IOPAD(0x958, PIN_INPUT | MUX_MODE0)	/* spi0_d1.spi0_d1 */
    			AM33XX_IOPAD(0x95c, PIN_OUTPUT | MUX_MODE0)	/* spi0_cs0.spi0_cs0 */
    		>;
    	};
    
    
    
    	i2c0_pins: pinmux_i2c0_pins {
    		pinctrl-single,pins = <
    			AM33XX_IOPAD(0x988, PIN_INPUT_PULLUP | MUX_MODE0)	/* i2c0_sda.i2c0_sda */
    			AM33XX_IOPAD(0x98c, PIN_INPUT_PULLUP | MUX_MODE0)	/* i2c0_scl.i2c0_scl */
    		>;
    	};
    
    	//i2c1_pins: pinmux_i2c1_pins {
    	//	pinctrl-single,pins = <
    	//		AM33XX_IOPAD(0x958, PIN_INPUT_PULLUP | MUX_MODE2)	/* spi0_d1.i2c1_sda */
    	//		AM33XX_IOPAD(0x95c, PIN_INPUT_PULLUP | MUX_MODE2)	/* spi0_cs0.i2c1_scl */
    	//	>;
    	//};
    
    	uart0_pins: pinmux_uart0_pins {
    		pinctrl-single,pins = <
    			AM33XX_IOPAD(0x970, PIN_INPUT_PULLUP | MUX_MODE0)	/* uart0_rxd.uart0_rxd */
    			AM33XX_IOPAD(0x974, PIN_OUTPUT_PULLDOWN | MUX_MODE0)	/* uart0_txd.uart0_txd */
    		>;
    	};
    
    	uart1_pins: pinmux_uart1_pins {
    		pinctrl-single,pins = <
    			AM33XX_IOPAD(0x978, PIN_INPUT | MUX_MODE0)		/* uart1_ctsn.uart1_ctsn */
    			AM33XX_IOPAD(0x97C, PIN_OUTPUT_PULLDOWN | MUX_MODE0)	/* uart1_rtsn.uart1_rtsn */
    			AM33XX_IOPAD(0x980, PIN_INPUT_PULLUP | MUX_MODE0)	/* uart1_rxd.uart1_rxd */
    			AM33XX_IOPAD(0x984, PIN_OUTPUT_PULLDOWN | MUX_MODE0)	/* uart1_txd.uart1_txd */
    		>;
    	};
    
    	//clkout2_pin: pinmux_clkout2_pin {
    	//	pinctrl-single,pins = <
    	//		AM33XX_IOPAD(0x9b4, PIN_OUTPUT_PULLDOWN | MUX_MODE3)	/* xdma_event_intr1.clkout2 */
    	//	>;
    	//};
    
    //	nandflash_pins_s0: nandflash_pins_s0 {
    //		pinctrl-single,pins = <
    //			AM33XX_IOPAD(0x800, PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad0.gpmc_ad0 */
    //			AM33XX_IOPAD(0x804, PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad1.gpmc_ad1 */
    //			AM33XX_IOPAD(0x808, PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad2.gpmc_ad2 */
    //			AM33XX_IOPAD(0x80c, PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad3.gpmc_ad3 */
    //			AM33XX_IOPAD(0x810, PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad4.gpmc_ad4 */
    //			AM33XX_IOPAD(0x814, PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad5.gpmc_ad5 */
    //			AM33XX_IOPAD(0x818, PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad6.gpmc_ad6 */
    //			AM33XX_IOPAD(0x81c, PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_ad7.gpmc_ad7 */
    //			//AM33XX_IOPAD(0x870, PIN_INPUT_PULLUP | MUX_MODE0)	/* gpmc_wait0.gpmc_wait0 */
    //			//AM33XX_IOPAD(0x874, PIN_INPUT_PULLUP | MUX_MODE7)	/* gpmc_wpn.gpio0_30 */
    //			//AM33XX_IOPAD(0x87c, PIN_OUTPUT | MUX_MODE0)		/* gpmc_csn0.gpmc_csn0  */
    //			AM33XX_IOPAD(0x890, PIN_OUTPUT | MUX_MODE0)		/* gpmc_advn_ale.gpmc_advn_ale */
    //			AM33XX_IOPAD(0x894, PIN_OUTPUT | MUX_MODE0)		/* gpmc_oen_ren.gpmc_oen_ren */
    //			//AM33XX_IOPAD(0x898, PIN_OUTPUT | MUX_MODE0)		/* gpmc_wen.gpmc_wen */
    //			AM33XX_IOPAD(0x89c, PIN_OUTPUT | MUX_MODE0)		/* gpmc_be0n_cle.gpmc_be0n_cle */
    //		>;
    //	};
    
    //	ecap0_pins: backlight_pins {
    //		pinctrl-single,pins = <
    //			AM33XX_IOPAD(0x964, MUX_MODE0)	/* eCAP0_in_PWM0_out.eCAP0_in_PWM0_out */
    //		>;
    //	};
    
    
    
    
    cpsw_default: cpsw_default {
    		pinctrl-single,pins = <
    			/* Slave 1 */
    			AM33XX_IOPAD(0x914, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txen.rgmii1_tctl */
    			AM33XX_IOPAD(0x918, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxdv.rgmii1_rctl */
    			AM33XX_IOPAD(0x91c, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd3.rgmii1_td3 */
    			AM33XX_IOPAD(0x920, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd2.rgmii1_td2 */
    			AM33XX_IOPAD(0x924, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd1.rgmii1_td1 */
    			AM33XX_IOPAD(0x928, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd0.rgmii1_td0 */
    			AM33XX_IOPAD(0x92c, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txclk.rgmii1_tclk */
    			AM33XX_IOPAD(0x930, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxclk.rgmii1_rclk */
    			AM33XX_IOPAD(0x934, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd3.rgmii1_rd3 */
    			AM33XX_IOPAD(0x938, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd2.rgmii1_rd2 */
    			AM33XX_IOPAD(0x93c, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd1.rgmii1_rd1 */
    			AM33XX_IOPAD(0x940, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd0.rgmii1_rd0 */
    
    			/* Slave 2 */
    			AM33XX_IOPAD(0x840, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a0.rgmii2_tctl */
    			AM33XX_IOPAD(0x844, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a1.rgmii2_rctl */
    			AM33XX_IOPAD(0x848, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a2.rgmii2_td3 */
    			AM33XX_IOPAD(0x84c, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a3.rgmii2_td2 */
    			AM33XX_IOPAD(0x850, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a4.rgmii2_td1 */
    			AM33XX_IOPAD(0x854, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a5.rgmii2_td0 */
    			AM33XX_IOPAD(0x858, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a6.rgmii2_tclk */
    			AM33XX_IOPAD(0x85c, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a7.rgmii2_rclk */
    			AM33XX_IOPAD(0x860, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a8.rgmii2_rd3 */
    			AM33XX_IOPAD(0x864, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a9.rgmii2_rd2 */
    			AM33XX_IOPAD(0x868, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a10.rgmii2_rd1 */
    			AM33XX_IOPAD(0x86c, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* gpmc_a11.rgmii2_rd0 */
    		>;
    	};
    
    
    cpsw_sleep: cpsw_sleep {
    		pinctrl-single,pins = <
    			/* Slave 1 reset value */
    			AM33XX_IOPAD(0x914, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x918, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x91c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x920, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x924, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x928, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x92c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x930, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x934, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x938, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x93c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x940, PIN_INPUT_PULLDOWN | MUX_MODE7)
    
    			/* Slave 2 reset value*/
    			AM33XX_IOPAD(0x840, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x844, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x848, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x84c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x850, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x854, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x858, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x85c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x860, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x864, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x868, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x86c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    		>;
    	};
    
            davinci_mdio_default: davinci_mdio_default {
    		pinctrl-single,pins = <
    			/* MDIO */
    			AM33XX_IOPAD(0x948, PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0)	/* mdio_data.mdio_data */
    			AM33XX_IOPAD(0x94c, PIN_OUTPUT_PULLUP | MUX_MODE0)			/* mdio_clk.mdio_clk */
    		>;
    	};
    
    	davinci_mdio_sleep: davinci_mdio_sleep {
    		pinctrl-single,pins = <
    			/* MDIO reset value */
    			AM33XX_IOPAD(0x948, PIN_INPUT_PULLDOWN | MUX_MODE7)
    			AM33XX_IOPAD(0x94c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    		>;
    	};
    
    
    
    
    
    
    	//cpsw_default: cpsw_default {
    	//	pinctrl-single,pins = <
    	//		/* Slave 1 */
    	//		AM33XX_IOPAD(0x914, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txen.rgmii1_tctl */
    	//		AM33XX_IOPAD(0x918, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxdv.rgmii1_rctl */
    	//		AM33XX_IOPAD(0x91c, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd3.rgmii1_td3 */
    	//		AM33XX_IOPAD(0x920, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd2.rgmii1_td2 */
    	//		AM33XX_IOPAD(0x924, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd1.rgmii1_td1 */
    	//		AM33XX_IOPAD(0x928, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd0.rgmii1_td0 */
    	//		AM33XX_IOPAD(0x92c, PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txclk.rgmii1_tclk */
    	//		AM33XX_IOPAD(0x930, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxclk.rgmii1_rclk */
    	//		AM33XX_IOPAD(0x934, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd3.rgmii1_rd3 */
    	//		AM33XX_IOPAD(0x938, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd2.rgmii1_rd2 */
    	//		AM33XX_IOPAD(0x93c, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd1.rgmii1_rd1 */
    	//		AM33XX_IOPAD(0x940, PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd0.rgmii1_rd0 */
    	//	>;
    	//};
    
    	//cpsw_sleep: cpsw_sleep {
    	//	pinctrl-single,pins = <
    	//		/* Slave 1 reset value */
    	//		AM33XX_IOPAD(0x914, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x918, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x91c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x920, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x924, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x928, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x92c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x930, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x934, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x938, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x93c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x940, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//	>;
    	//};
    
    	//davinci_mdio_default: davinci_mdio_default {
    	//	pinctrl-single,pins = <
    	//		/* MDIO */
    	//		AM33XX_IOPAD(0x948, PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0)	/* mdio_data.mdio_data */
    	//		AM33XX_IOPAD(0x94c, PIN_OUTPUT_PULLUP | MUX_MODE0)			/* mdio_clk.mdio_clk */
    	//	>;
    	//};
    
    	//davinci_mdio_sleep: davinci_mdio_sleep {
    	//	pinctrl-single,pins = <
    	//		/* MDIO reset value */
    	//		AM33XX_IOPAD(0x948, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x94c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//	>;
    	//};
    
    	mmc1_pins: pinmux_mmc1_pins {
    		pinctrl-single,pins = <
    			AM33XX_IOPAD(0x960, PIN_INPUT | MUX_MODE7)		/* spi0_cs1.gpio0_6 */
    			AM33XX_IOPAD(0x8fc, PIN_INPUT_PULLUP | MUX_MODE0)	/* mmc0_dat0.mmc0_dat0 */
    			AM33XX_IOPAD(0x8f8, PIN_INPUT_PULLUP | MUX_MODE0)	/* mmc0_dat1.mmc0_dat1 */
    			AM33XX_IOPAD(0x8f4, PIN_INPUT_PULLUP | MUX_MODE0)	/* mmc0_dat2.mmc0_dat2 */
    			AM33XX_IOPAD(0x8f0, PIN_INPUT_PULLUP | MUX_MODE0)	/* mmc0_dat3.mmc0_dat3 */
    			AM33XX_IOPAD(0x904, PIN_INPUT_PULLUP | MUX_MODE0)	/* mmc0_cmd.mmc0_cmd */
    			AM33XX_IOPAD(0x900, PIN_INPUT_PULLUP | MUX_MODE0)	/* mmc0_clk.mmc0_clk */
    			//AM33XX_IOPAD(0x9a0, PIN_INPUT | MUX_MODE4)		/* mcasp0_aclkr.mmc0_sdwp */
    		>;
    	};
    
    	//mmc3_pins: pinmux_mmc3_pins {
    	//	pinctrl-single,pins = <
    	//		AM33XX_IOPAD(0x844, PIN_INPUT_PULLUP | MUX_MODE3)	/* gpmc_a1.mmc2_dat0, INPUT_PULLUP | MODE3 */
    	//		AM33XX_IOPAD(0x848, PIN_INPUT_PULLUP | MUX_MODE3)	/* gpmc_a2.mmc2_dat1, INPUT_PULLUP | MODE3 */
    	//		AM33XX_IOPAD(0x84c, PIN_INPUT_PULLUP | MUX_MODE3)	/* gpmc_a3.mmc2_dat2, INPUT_PULLUP | MODE3 */
    	//		AM33XX_IOPAD(0x878, PIN_INPUT_PULLUP | MUX_MODE3)	/* gpmc_ben1.mmc2_dat3, INPUT_PULLUP | MODE3 */
    	//		AM33XX_IOPAD(0x888, PIN_INPUT_PULLUP | MUX_MODE3)	/* gpmc_csn3.mmc2_cmd, INPUT_PULLUP | MODE3 */
    	//		AM33XX_IOPAD(0x88c, PIN_INPUT_PULLUP | MUX_MODE3)	/* gpmc_clk.mmc2_clk, INPUT_PULLUP | MODE3 */
    	//	>;
    	//};
    
    
            mmc3_pins: pinmux_mmc3_pins {
    		pinctrl-single,pins = <
                            AM33XX_IOPAD(0x820, PIN_INPUT_PULLUP | MUX_MODE2)		/* gpmc_ad8.mmc1_dat0 */
    			AM33XX_IOPAD(0x824, PIN_INPUT_PULLUP | MUX_MODE2)		/* gpmc_ad9.mmc1_dat1 */
    			AM33XX_IOPAD(0x828, PIN_INPUT_PULLUP | MUX_MODE2)		/* gpmc_ad10.mmc1_dat2 */
    			AM33XX_IOPAD(0x82c, PIN_INPUT_PULLUP | MUX_MODE2)		/* gpmc_ad11.mmc1_dat3 */
    			AM33XX_IOPAD(0x830, PIN_INPUT_PULLUP | MUX_MODE2)		/* gpmc_ad12.mmc1_dat4 */
    			AM33XX_IOPAD(0x834, PIN_INPUT_PULLUP | MUX_MODE2)		/* gpmc_ad13.mmc1_dat5 */
    			AM33XX_IOPAD(0x838, PIN_INPUT_PULLUP | MUX_MODE2)		/* gpmc_ad14.mmc1_dat6 */
    			AM33XX_IOPAD(0x83c, PIN_INPUT_PULLUP | MUX_MODE2)		/* gpmc_ad15.mmc1_dat7 */
                            AM33XX_IOPAD(0x888, PIN_INPUT_PULLUP | MUX_MODE7)		/* gpmc_csn3.gpio2_0 */
    			AM33XX_IOPAD(0x884, PIN_OUTPUT_PULLUP | MUX_MODE2)		/* gpmc_csn2.mmc1_cmd */
                            AM33XX_IOPAD(0x880, PIN_OUTPUT | MUX_MODE2)		        /* gpmc_csn1.mmc1_clk */
    			AM33XX_IOPAD(0x87c, PIN_OUTPUT_PULLUP | MUX_MODE7)		/* gpmc_csn0.gpio1_29 */
                   >;
    			
    	};
    
    
    
    
    
    
    	//wlan_pins: pinmux_wlan_pins {
    	//	pinctrl-single,pins = <
    	//		AM33XX_IOPAD(0x840, PIN_OUTPUT_PULLDOWN | MUX_MODE7)	/* gpmc_a0.gpio1_16 */
    	//		AM33XX_IOPAD(0x99c, PIN_INPUT | MUX_MODE7)		/* mcasp0_ahclkr.gpio3_17 */
    	//		AM33XX_IOPAD(0x9ac, PIN_OUTPUT_PULLDOWN | MUX_MODE7)	/* mcasp0_ahclkx.gpio3_21 */
    	//	>;
    	//};
    
    	//lcd_pins_s0: lcd_pins_s0 {
    	//	pinctrl-single,pins = <
    	//		//AM33XX_IOPAD(0x820, PIN_OUTPUT | MUX_MODE1)		/* gpmc_ad8.lcd_data23 */
    	//		//AM33XX_IOPAD(0x824, PIN_OUTPUT | MUX_MODE1)		/* gpmc_ad9.lcd_data22 */
    	//		//AM33XX_IOPAD(0x828, PIN_OUTPUT | MUX_MODE1)		/* gpmc_ad10.lcd_data21 */
    	///		//AM33XX_IOPAD(0x82c, PIN_OUTPUT | MUX_MODE1)		/* gpmc_ad11.lcd_data20 */
    	//		//AM33XX_IOPAD(0x830, PIN_OUTPUT | MUX_MODE1)		/* gpmc_ad12.lcd_data19 */
    	//		//AM33XX_IOPAD(0x834, PIN_OUTPUT | MUX_MODE1)		/* gpmc_ad13.lcd_data18 */
    	//		//AM33XX_IOPAD(0x838, PIN_OUTPUT | MUX_MODE1)		/* gpmc_ad14.lcd_data17 */
    	//		//AM33XX_IOPAD(0x83c, PIN_OUTPUT | MUX_MODE1)		/* gpmc_ad15.lcd_data16 */
    	//		AM33XX_IOPAD(0x8a0, PIN_OUTPUT | MUX_MODE0)		/* lcd_data0.lcd_data0 */
    	//		AM33XX_IOPAD(0x8a4, PIN_OUTPUT | MUX_MODE0)		/* lcd_data1.lcd_data1 */
    	//		AM33XX_IOPAD(0x8a8, PIN_OUTPUT | MUX_MODE0)		/* lcd_data2.lcd_data2 */
    	//		AM33XX_IOPAD(0x8ac, PIN_OUTPUT | MUX_MODE0)		/* lcd_data3.lcd_data3 */
    	//		AM33XX_IOPAD(0x8b0, PIN_OUTPUT | MUX_MODE0)		/* lcd_data4.lcd_data4 */
    	//		AM33XX_IOPAD(0x8b4, PIN_OUTPUT | MUX_MODE0)		/* lcd_data5.lcd_data5 */
    	//		AM33XX_IOPAD(0x8b8, PIN_OUTPUT | MUX_MODE0)		/* lcd_data6.lcd_data6 */
    	//		AM33XX_IOPAD(0x8bc, PIN_OUTPUT | MUX_MODE0)		/* lcd_data7.lcd_data7 */
    	//		AM33XX_IOPAD(0x8c0, PIN_OUTPUT | MUX_MODE0)		/* lcd_data8.lcd_data8 */
    	//		AM33XX_IOPAD(0x8c4, PIN_OUTPUT | MUX_MODE0)		/* lcd_data9.lcd_data9 */
    	//		AM33XX_IOPAD(0x8c8, PIN_OUTPUT | MUX_MODE0)		/* lcd_data10.lcd_data10 */
    	//		AM33XX_IOPAD(0x8cc, PIN_OUTPUT | MUX_MODE0)		/* lcd_data11.lcd_data11 */
    	//		AM33XX_IOPAD(0x8d0, PIN_OUTPUT | MUX_MODE0)		/* lcd_data12.lcd_data12 */
    	//		AM33XX_IOPAD(0x8d4, PIN_OUTPUT | MUX_MODE0)		/* lcd_data13.lcd_data13 */
    	//		AM33XX_IOPAD(0x8d8, PIN_OUTPUT | MUX_MODE0)		/* lcd_data14.lcd_data14 */
    	//		AM33XX_IOPAD(0x8dc, PIN_OUTPUT | MUX_MODE0)		/* lcd_data15.lcd_data15 */
    	//		AM33XX_IOPAD(0x8e0, PIN_OUTPUT | MUX_MODE0)		/* lcd_vsync.lcd_vsync */
    	//		AM33XX_IOPAD(0x8e4, PIN_OUTPUT | MUX_MODE0)		/* lcd_hsync.lcd_hsync */
    	//		AM33XX_IOPAD(0x8e8, PIN_OUTPUT | MUX_MODE0)		/* lcd_pclk.lcd_pclk */
    	//		AM33XX_IOPAD(0x8ec, PIN_OUTPUT | MUX_MODE0)		/* lcd_ac_bias_en.lcd_ac_bias_en */
    	//	>;
    	//};
    
    	//mcasp1_pins: mcasp1_pins {
    	//	pinctrl-single,pins = <
    	//		AM33XX_IOPAD(0x90c, PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_crs.mcasp1_aclkx */
    	//		AM33XX_IOPAD(0x910, PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_rxerr.mcasp1_fsx */
    	//		AM33XX_IOPAD(0x908, PIN_OUTPUT_PULLDOWN | MUX_MODE4) /* mii1_col.mcasp1_axr2 */
    	//		AM33XX_IOPAD(0x944, PIN_INPUT_PULLDOWN | MUX_MODE4) /* rmii1_ref_clk.mcasp1_axr3 */
    	//	>;
    	//};
    
    
         spi1_pins: spi1_pins {
    		pinctrl-single,pins = <
    			AM33XX_IOPAD(0x90c, PIN_OUTPUT_PULLUP | MUX_MODE2) /* mii1_crs.spi1_d0 */
    			AM33XX_IOPAD(0x910, PIN_INPUT_PULLDOWN | MUX_MODE2) /* mii1_rxerr.spi1_d1 */
    			AM33XX_IOPAD(0x908, PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_col.spi1_sclk */
    			AM33XX_IOPAD(0x99c, PIN_OUTPUT | MUX_MODE3)		/* mcasp0_ahclkr.spi1_cs0 */
    		>;
    	};
    
    
    	//usb1_pins: usb1_pins {
    	//	pinctrl-single,pins = <
    	//		AM33XX_IOPAD(0x910, PIN_OUTPUT_PULLDOWN | MUX_MODE0)             /* usb1_drvvbus.usb1_drvvbus*/
    	//		AM33XX_IOPAD(0x9a0, PIN_OUTPUT_PULLDOWN | MUX_MODE7)		/* mcasp0_aclkr.gpio3_18 */
    	//	>;
    	//};
    
    
    
    	//mcasp1_pins_sleep: mcasp1_pins_sleep {
    	//	pinctrl-single,pins = <
    	//		AM33XX_IOPAD(0x90c, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x910, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x908, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//		AM33XX_IOPAD(0x944, PIN_INPUT_PULLDOWN | MUX_MODE7)
    	//	>;
    	//};
    
    	//dcan1_pins_default: dcan1_pins_default {
    	//	pinctrl-single,pins = <
    	//		AM33XX_IOPAD(0x968, PIN_OUTPUT | MUX_MODE2) /* uart0_ctsn.d_can1_tx */
    	//		AM33XX_IOPAD(0x96c, PIN_INPUT_PULLDOWN | MUX_MODE2) /* uart0_rtsn.d_can1_rx */
    	//	>;
    	//};
    };
    
    &uart0 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&uart0_pins>;
    
    	status = "okay";
    };
    
    &uart1 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&uart1_pins>;
    
    	status = "okay";
    };
    
    &i2c0 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&i2c0_pins>;
    
    	status = "okay";
    	clock-frequency = <400000>;
    
    	tps: tps@2d {
    		reg = <0x2d>;
    	};
    };
    
    &spi0
    {
    	pinctrl-names = "default";
    	pinctrl-0 = <&spi0_pins>;
    	ti,pindir-d0-out-d1-in = <1>;
    	status = "okay";
    	spidev@0
    	{
    		compatible = "linux,spidev";
    		spi-max-frequency = <48000000>;
    		reg = <0x0>;
    		status = "okay";
    	};
    };
    
    
    &spi1
    {
    	pinctrl-names = "default";
    	pinctrl-0 = <&spi1_pins>;
    	ti,pindir-d0-out-d1-in = <1>;
    	status = "okay";
    	spidev@1
    	{
    		compatible = "linux,spidev";
    		spi-max-frequency = <48000000>;
    		reg = <0x0>;
    		status = "okay";
    	};
    };
    
    
    
    
    
    &usb {
    	status = "okay";
    };
    
    &usb_ctrl_mod {
    	status = "okay";
    };
    
    &usb0_phy {
    	status = "okay";
    };
    
    &usb1_phy {
    	status = "okay";
    };
    
    &usb0 {
    	status = "okay";
    };
    
    &usb1 {
    	status = "okay";
    	dr_mode = "host";
    };
    
    &cppi41dma  {
    	status = "okay";
    };
    
    //&i2c1 {
    //	pinctrl-names = "default";
    //	pinctrl-0 = <&i2c1_pins>;
    
    //	status = "okay";
    //	clock-frequency = <100000>;
    
    //	lis331dlh: lis331dlh@18 {
    //		compatible = "st,lis331dlh", "st,lis3lv02d";
    //		reg = <0x18>;
    //		Vdd-supply = <&lis3_reg>;
    //		Vdd_IO-supply = <&lis3_reg>;
    
    //		st,click-single-x;
    //		st,click-single-y;
    //		st,click-single-z;
    //		st,click-thresh-x = <10>;
    //		st,click-thresh-y = <10>;
    //		st,click-thresh-z = <10>;
    //		st,irq1-click;
    //		st,irq2-click;
    //		st,wakeup-x-lo;
    //		st,wakeup-x-hi;
    //		st,wakeup-y-lo;
    //		st,wakeup-y-hi;
    //		st,wakeup-z-lo;
    //		st,wakeup-z-hi;
    //		st,min-limit-x = <120>;
    //		st,min-limit-y = <120>;
    //		st,min-limit-z = <140>;
    //		st,max-limit-x = <550>;
    //		st,max-limit-y = <550>;
    //		st,max-limit-z = <750>;
    //	};
    
    //	tsl2550: tsl2550@39 {
    //		compatible = "taos,tsl2550";
    //		reg = <0x39>;
    //	};
    
    //	tmp275: tmp275@48 {
    //		compatible = "ti,tmp275";
    //		reg = <0x48>;
    //	};
    
    //	tlv320aic3106: tlv320aic3106@1b {
    //		#sound-dai-cells = <0>;
    //		compatible = "ti,tlv320aic3106";
    //		reg = <0x1b>;
    //		status = "okay";
    
    //		/* Regulators */
    //		AVDD-supply = <&vaux2_reg>;
    //		IOVDD-supply = <&vaux2_reg>;
    //		DRVDD-supply = <&vaux2_reg>;
    //		DVDD-supply = <&vbat>;
    //	};
    //};
    
    &lcdc {
    	status = "okay";
    
    	blue-and-red-wiring = "crossed";
    };
    
    &elm {
    	status = "okay";
    };
    
    //&epwmss0 {
    //	status = "okay";
    //
    //	ecap0: ecap@48300100 {
    //		status = "okay";
    //		pinctrl-names = "default";
    //		pinctrl-0 = <&ecap0_pins>;
    //	};
    //};
    
    //&gpmc {
    //	status = "okay";
    //	pinctrl-names = "default";
    //	pinctrl-0 = <&nandflash_pins_s0>;
    //	ranges = <0 0 0x08000000 0x1000000>;	/* CS0: 16MB for NAND */
    //	nand@0,0 {
    //		compatible = "ti,omap2-nand";
    //		reg = <0 0 4>; /* CS0, offset 0, IO size 4 */
    //		interrupt-parent = <&gpmc>;
    //		interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
    //			     <1 IRQ_TYPE_NONE>;	/* termcount */
    //		rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 */
    //		ti,nand-xfer-type = "prefetch-dma";
    //		ti,nand-ecc-opt = "bch8";
    //		ti,elm-id = <&elm>;
    //		nand-bus-width = <8>;
    //		gpmc,device-width = <1>;
    //		gpmc,sync-clk-ps = <0>;
    //		gpmc,cs-on-ns = <0>;
    //		gpmc,cs-rd-off-ns = <44>;
    //		gpmc,cs-wr-off-ns = <44>;
    //		gpmc,adv-on-ns = <6>;
    //		gpmc,adv-rd-off-ns = <34>;
    //		gpmc,adv-wr-off-ns = <44>;
    //		gpmc,we-on-ns = <0>;
    //		gpmc,we-off-ns = <40>;
    //		gpmc,oe-on-ns = <0>;
    //		gpmc,oe-off-ns = <54>;
    //		gpmc,access-ns = <64>;
    //		gpmc,rd-cycle-ns = <82>;
    //		gpmc,wr-cycle-ns = <82>;
    //		gpmc,bus-turnaround-ns = <0>;
    //		gpmc,cycle2cycle-delay-ns = <0>;
    //		gpmc,clk-activation-ns = <0>;
    //		gpmc,wr-access-ns = <40>;
    ////		gpmc,wr-data-mux-bus-ns = <0>;
    //		/* MTD partition table */
    //		/* All SPL-* partitions are sized to minimal length
    //		 * which can be independently programmable. For
    //		 * NAND flash this is equal to size of erase-block */
    //		#address-cells = <1>;
    //		#size-cells = <1>;
    //		partition@0 {
    //			label = "NAND.SPL";
    //			reg = <0x00000000 0x000020000>;
    //		};
    //		partition@1 {
    //			label = "NAND.SPL.backup1";
    //			reg = <0x00020000 0x00020000>;
    //		};
    //		partition@2 {
    //			label = "NAND.SPL.backup2";
    //			reg = <0x00040000 0x00020000>;
    //		};
    //		partition@3 {
    //			label = "NAND.SPL.backup3";
    //			reg = <0x00060000 0x00020000>;
    //		};
    //		partition@4 {
    //			label = "NAND.u-boot-spl-os";
    //			reg = <0x00080000 0x00040000>;
    ///		};
    //	//	partition@5 {
    //			label = "NAND.u-boot";
    //			reg = <0x000C0000 0x00100000>;
    //		};
    //		partition@6 {
    //			label = "NAND.u-boot-env";
    //			reg = <0x001C0000 0x00020000>;
    //		};
    //		partition@7 {
    //			label = "NAND.u-boot-env.backup1";
    //			reg = <0x001E0000 0x00020000>;
    //		};
    //		partition@8 {
    //			label = "NAND.kernel";
    ////			reg = <0x00200000 0x00800000>;
    	//	};
    	//	partition@9 {
    	//		label = "NAND.file-system";
    	//		reg = <0x00A00000 0x0F600000>;
    	//	};
    	//};
    //};
    
    #include "tps65910.dtsi"
    
    //&mcasp1 {
    //	#sound-dai-cells = <0>;
    //	pinctrl-names = "default", "sleep";
    //	pinctrl-0 = <&mcasp1_pins>;
    //	pinctrl-1 = <&mcasp1_pins_sleep>;
    //
    //	status = "okay";
    //
    //	op-mode = <0>;          /* MCASP_IIS_MODE */
    //	tdm-slots = <2>;
    //	/* 4 serializers */
    //	serial-dir = <  /* 0: INACTIVE, 1: TX, 2: RX */
    //		0 0 1 2
    //	>;
    //	tx-num-evt = <32>;
    //	rx-num-evt = <32>;
    //};
    
    &tps {
    	vcc1-supply = <&vbat>;
    	vcc2-supply = <&vbat>;
    	vcc3-supply = <&vbat>;
    	vcc4-supply = <&vbat>;
    	vcc5-supply = <&vbat>;
    	vcc6-supply = <&vbat>;
    	vcc7-supply = <&vbat>;
    	vccio-supply = <&vbat>;
    
    	regulators {
    		vrtc_reg: regulator@0 {
    			regulator-always-on;
    		};
    
    		vio_reg: regulator@1 {
    			regulator-always-on;
    		};
    
    		vdd1_reg: regulator@2 {
    			/* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
    			regulator-name = "vdd_mpu";
    			regulator-min-microvolt = <912500>;
    			regulator-max-microvolt = <1351500>;
    			regulator-boot-on;
    			regulator-always-on;
    		};
    
    		vdd2_reg: regulator@3 {
    			/* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
    			regulator-name = "vdd_core";
    			regulator-min-microvolt = <912500>;
    			regulator-max-microvolt = <1150000>;
    			regulator-boot-on;
    			regulator-always-on;
    		};
    
    		vdd3_reg: regulator@4 {
    			regulator-always-on;
    		};
    
    		vdig1_reg: regulator@5 {
    			regulator-always-on;
    		};
    
    		vdig2_reg: regulator@6 {
    			regulator-always-on;
    		};
    
    		vpll_reg: regulator@7 {
    			regulator-always-on;
    		};
    
    		vdac_reg: regulator@8 {
    			regulator-always-on;
    		};
    
    		vaux1_reg: regulator@9 {
    			regulator-always-on;
    		};
    
    		vaux2_reg: regulator@10 {
    			regulator-always-on;
    		};
    
    		vaux33_reg: regulator@11 {
    			regulator-always-on;
    		};
    
    		vmmc_reg: regulator@12 {
    			regulator-min-microvolt = <1800000>;
    			regulator-max-microvolt = <3300000>;
    			regulator-always-on;
    		};
    	};
    };
    
    
    &mac {
    	pinctrl-names = "default", "sleep";
    	pinctrl-0 = <&cpsw_default>;
    	pinctrl-1 = <&cpsw_sleep>;
    	dual_emac = <1>;
    	status = "okay";
    };
    
    &davinci_mdio {
    	pinctrl-names = "default", "sleep";
    	pinctrl-0 = <&davinci_mdio_default>;
    	pinctrl-1 = <&davinci_mdio_sleep>;
    	status = "okay";
    };
    
    &cpsw_emac0 {
    	phy_id = <&davinci_mdio>, <0>;
    	phy-mode = "rgmii-txid";
    	dual_emac_res_vlan = <1>;
    };
    
    &cpsw_emac1 {
    	phy_id = <&davinci_mdio>, <1>;
    	phy-mode = "rgmii-txid";
    	dual_emac_res_vlan = <2>;
    };
    
    
    
    
    
    
    //&mac {
    //	pinctrl-names = "default", "sleep";
    //	pinctrl-0 = <&cpsw_default>;
    //	pinctrl-1 = <&cpsw_sleep>;
    //	status = "okay";
    //};
    
    //&davinci_mdio {
    //	pinctrl-names = "default", "sleep";
    //	pinctrl-0 = <&davinci_mdio_default>;
    //	pinctrl-1 = <&davinci_mdio_sleep>;
    //	status = "okay";
    //};
    
    //&cpsw_emac0 {
    //	phy_id = <&davinci_mdio>, <0>;
    //	phy-mode = "rgmii-txid";
    //};
    
    //&cpsw_emac1 {
    //	phy_id = <&davinci_mdio>, <1>;
    //	phy-mode = "rgmii-txid";
    //};
    
    &tscadc {
    	status = "okay";
    	tsc {
    		ti,wires = <4>;
    		ti,x-plate-resistance = <200>;
    		ti,coordinate-readouts = <5>;
    		ti,wire-config = <0x00 0x11 0x22 0x33>;
    		ti,charge-delay = <0x400>;
    	};
    
    	adc {
    		ti,adc-channels = <4 5 6 7>;
    	};
    };
    
    &mmc1 {
    	status = "okay";
    	vmmc-supply = <&vmmc_reg>;
    	bus-width = <4>;
    	pinctrl-names = "default";
    	pinctrl-0 = <&mmc1_pins>;
    	cd-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
    };
    
    &mmc3 {
    	/* these are on the crossbar and are outlined in the
    	   xbar-event-map element */
    	dmas = <&edma_xbar 12 0 1
    		&edma_xbar 13 0 2>;
    	dma-names = "tx", "rx";
    	status = "okay";
    	vmmc-supply = <&wlan_en_reg>;
    	bus-width = <4>;
    	pinctrl-names = "default";
    	pinctrl-0 = <&mmc3_pins>;
    	ti,non-removable;
    	ti,needs-special-hs-handling;
    	cap-power-off-card;
    	keep-power-in-suspend;
    
    	#address-cells = <1>;
    	#size-cells = <0>;
    	wlcore: wlcore@0 {
    		compatible = "ti,wl1835";
    		reg = <2>;
    		interrupt-parent = <&gpio3>;
    		interrupts = <17 IRQ_TYPE_LEVEL_HIGH>;
    	};
    };
    
    &sham {
    	status = "okay";
    };
    
    &aes {
    	status = "okay";
    };
    
    //&dcan1 {
    //	status = "disabled";	/* Enable only if Profile 1 is selected */
    //	pinctrl-names = "default";
    //	pinctrl-0 = <&dcan1_pins_default>;
    //};
    
    &rtc {
    	clocks = <&clk_32768_ck>, <&clkdiv32k_ick>;
    	clock-names = "ext-clk", "int-clk";
    };
    
    &wkup_m3_ipc {
    	ti,scale-data-fw = "am335x-evm-scale-data.bin";
    };
    
    &pruss_soc_bus {
    	status = "okay";
    
    	pruss: pruss@0 {
    		status = "okay";
    	};
    };
    
    &sgx {
    	status = "okay";
    };
    

  • Vamsi,

    I would suggest you to align your DTS file with am335x-boneblack-spi0.dtsi

    &spi0
    {
    +#address-cells = <1>;
    +#size-cells = <0>;
    pinctrl-names = "default";
    pinctrl-0 = <&spi0_pins>;
    ti,pindir-d0-out-d1-in = <1>;
    status = "okay";
    -spidev@0
    +channel@0 {
    {
    +#address-cells = <1>;
    +#size-cells = <0>;
    -compatible = "linux,spidev";
    +compatible = "spidev";
    spi-max-frequency = <48000000>;
    reg = <0x0>;
    -status = "okay";
    };
    };

    Then boot up and make sure you have no error/warning messages related to McSPI. You can also provide me the boot log to check. Then check your McSPI0 pinmux registers in user space with devmem2 tool, make sure these settings are correct.

    You can also explore the full duplex example:

    linux-4.14.40/tools/spi/spidev_fdx.c

    linux-sunxi.org/SPIdev

    Regards,
    Pavel
  • Definition of SPI in my DTS file.
    
    &spi0
    {
    	pinctrl-names = "default";
    	pinctrl-0 = <&spi0_pins>;
    	ti,pindir-d0-out-d1-in = <1>;
    	status = "okay";
    	spidev@0
    	{
    		compatible = "linux,spidev";
    		spi-max-frequency = <48000000>;
    		reg = <0x0>;
    		status = "okay";
    	};
    };
    
    
    
    SPI definition in am335x-boneblack-spi0.dtsi
    
    &spi0 {
    	#address-cells = <1>;
    	#size-cells = <0>;
    
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&bb_spi0_pins>;
    
    
    	channel@0 {
    		#address-cells = <1>;
    		#size-cells = <0>;
    
    		compatible = "spidev";
    
    		reg = <0>;
    		spi-max-frequency = <16000000>;
    		spi-cpha;
    	};
    
    
    	channel@1 {
    		#address-cells = <1>;
    		#size-cells = <0>;
    
    		compatible = "spidev";
    
    		reg = <1>;
    		spi-max-frequency = <16000000>;
    	};
    };


    Please help me to modify my dts....
  • Vamsi Siddhani said:
    Definition of SPI in my DTS file. &spi0 { pinctrl-names = "default"; pinctrl-0 = <&spi0_pins>; ti,pindir-d0-out-d1-in = <1>; status = "okay"; spidev@0 { compatible = "linux,spidev"; spi-max-frequency = <48000000>; reg = <0x0>; status = "okay"; }; };

    Vamsi Siddhani said:
    Please help me to modify my dts....

    You should modify your DTS as below:

    &spi0
    {
         #address-cells = <1>;
         #size-cells = <0>;
        pinctrl-names = "default";
        pinctrl-0 = <&spi0_pins>;
        ti,pindir-d0-out-d1-in = <1>;
        status = "okay";
         channel@0
            {
              #address-cells = <1>;
              #size-cells = <0>;
              compatible = "spidev";
            spi-max-frequency = <48000000>;
            reg = <0x0>;
        };
    };

    Regards,
    Pavel

  • If you have no more questions related to the subject of this e2e thread, please close/verify/resolve this thread.

    Regards,
    Pavel
  • I'll try it and let you know if it worked.
  • Spidev1.0 got detected. But I want to test this interface using a c program. For this I need your help. Tomorrow I'll post the details of the IC.

    Thank you.
  • For SPI, we are using MT25QL256ABA1ESF0SIT NOR Flash memory. I am also uploading the datasheet of this IC. Please let me help to test SPI using a sample C program by reading and writing data to and from this IC.

    MT25Q_QLJS_L_256_ABA_0.pdf

  • Vamsi,

    You can refer to the McSPI driver user guide. It explains how to access SPI NOR flash from user space:

    software-dl.ti.com/.../Foundational_Components_Kernel_Drivers.html

    Regards,
    Pavel
  • If you have no more questions related to the subject, please close/verify/resolve the below thread.

    Regards,
    Pavel
  • Our problem is solved. Our code is working fine between NOR flash and AM335x processor.
    Now we want to test the same between FPGA and AM335x processor.
    can you please help me to modify it?


    #include <stdio.h>
    #include <stdint.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <getopt.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <linux/types.h>
    #include <linux/spi/spidev.h>
    
    static uint8_t mode;
    static uint8_t bits = 8;
    static uint32_t speed = 500000;
    static uint16_t delay;
    const char *device = "/dev/spidev0.0";
    
    char buf[10];
    char buf2[10];
    int com_serial;
    int failcount;
    struct spi_ioc_transfer xfer[2];
    struct spi_ioc_transfer xfer1[2];
    
    void spi_write(int file)
    {
        unsigned char   buf[32];
        int status;
        buf[0] = 0x06;
        xfer1[0].tx_buf = (unsigned long)buf;
        xfer1[0].len = 1; /* Length of  command to write*/
        status = ioctl(file, SPI_IOC_MESSAGE(1), xfer1);
        if (status < 0)
        {
            perror("SPI_IOC_MESSAGE");
            return;
        }
        sleep(2);
        buf[0] = 0x01;
        buf[1] = 0x40;
        xfer1[0].tx_buf = (unsigned long)buf;
        xfer1[0].len = 2; /* Length of  command to write*/
        status = ioctl(file, SPI_IOC_MESSAGE(1), xfer1);
        if (status < 0)
        {
            perror("SPI_IOC_MESSAGE");
            return;
        }
        printf("Write Status register: %02x %02x\n", buf[0], buf[1]);
    //    sleep(2);
        //    printf("Read Status register: %02x %02x %02x %02x\n", buf2[0], buf2[1], buf2[2], buf2[3]);
    
        com_serial=1;
        failcount=0;
    }
    
    
    char * spi_read(int file)
    {
        int status;
        while(1){
            memset(buf, 0, 10*sizeof(buf[0]));
            memset(buf2, 0, 10*sizeof(buf2[0]));
            buf[0] = 0x9E;//0x9E;
            //        buf[1] = 0x00;
            //        buf[2] = 0x00;
            //        buf[3] = 0x00;
            xfer[0].tx_buf = (unsigned long)buf;
            xfer[0].len = 1; /* Length of  command to write*/
            xfer[1].rx_buf = (unsigned long) buf2;
            xfer[1].len = 1; /* Length of Data to read */
            status = ioctl(file, SPI_IOC_MESSAGE(2), xfer);
            if (status < 0)
            {
                perror("SPI_IOC_MESSAGE");
                return 0;
            }
            //printf("env: %02x %02x %02x\n", buf[0], buf[1], buf[2]);
            printf("Read Status register: %02x\n", buf2[0]);
        }
        return 0;
    }
    int main(int argc, char *argv[])
    {
        int file;
    //    QFileSystemWatcher dulawatch_watcher;
        memset(buf, 0, 10*sizeof(buf[0]));
        memset(buf2, 0, 10*sizeof(buf2[0]));
    
        if ((file = open(device,O_RDWR)) < 0)
        {
            printf("Failed to open the bus.");
            /* ERROR HANDLING; you can check errno to see what went wrong */
            exit(1);
        }
    
        printf("success to open the bus.");
    
        if (ioctl(file, SPI_IOC_RD_MODE, &mode) < 0)
        {
            perror("SPI rd_mode");
            return 0;
        }
        //    if (ioctl(file, SPI_IOC_RD_LSB_FIRST, &lsb) < 0)
        //    {
        //        perror("SPI rd_lsb_fist");
        //        return;
        //    }
    
        if (ioctl(file, SPI_IOC_WR_BITS_PER_WORD, &bits)<0)
        {
            perror("can't set bits per word");
            return 0;
        }
    
        if (ioctl(file, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0)
        {
            perror("SPI bits_per_word");
            return 0;
        }
    
        if (ioctl(file, SPI_IOC_WR_MAX_SPEED_HZ, &speed)<0)
        {
            perror("can't set max speed hz");
            return 0;
        }
    
        if (ioctl(file, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0)
        {
            perror("SPI max_speed_hz");
            return 0;
        }
    
    //    printf("spi mode %d, %d bits, %d Hz max\n",mode, bits, speed);
    //    QProcess::execute("/etc/XMPP-qt/gpio.sh");
    //    dulawatch_watcher=new QFileSystemWatcher(this);
    //    connect(dulawatch_watcher,SIGNAL(fileChanged(QString)),this,SLOT(spi_read(file)));
    //    dulawatch_watcher->addPath("/sys/class/gpio/gpio50/value");
        spi_write(file);
    //    spi_read(file);
        return 0;
    }
    

  • Vamsi,

    As you have fix your code for NOR flash McSPI code, please close/verify/resolve this thread. And open new thread for FPGA issue and questions.

    Regards,
    Pavel
  • Could you please help me in closing this thread as I am unable find the verify/close option.

    Regards,
    Vamsi
  • Closing this thread.