[Intel AI SW 아카데미] 어셈블리어로 버튼 제어

Jimeaning·2024년 2월 14일
0

Intel AIoT

목록 보기
34/38

2024.02.14 (수)
(rasp) samba에 파일 복사해서 넣기

com5에서 진행

sudo cp /srv/samba/u-boot_ledkey_ksh.bin /boot/firmware/u-boot.bin
sync // 메모리 버퍼에 저장된 내용이 sd카드에 저장 안 될 때가 있음

껐다 켜기
U-boot로 접속

  1 #include <common.h>
  2 #include <command.h>
  3 #include <asm/io.h>
  4
  5 #define BCM2711_GPIO_GPFSEL0    0xFE200000
  6 #define BCM2711_GPIO_GPFSEL1    0xFE200004
  7 #define BCM2711_GPIO_GPFSEL2    0xFE200008
  8 #define BCM2711_GPIO_GPSET0     0xFE20001C
  9 #define BCM2711_GPIO_GPCLR0     0xFE200028
 10 #define BCM2711_GPIO_GPLEV0     0xFE200034
 11
 12 #define GPIO6_9_SIG_OUTPUT      0x09240000
 13 #define GPIO10_13_SIG_OUTPUT    0x00000249
 14
 15 struct cmd_tbl_t;
 16 void led_init(void)
 17 {
 18     unsigned long temp;
 19     temp = readl(BCM2711_GPIO_GPFSEL0);
 20     temp = temp & 0x0003ffff;
 21 //  temp = temp & ~0xfffc0000;
 22     temp = temp | GPIO6_9_SIG_OUTPUT;
 23     writel(temp,BCM2711_GPIO_GPFSEL0);
 24 //  writel(GPIO6_9_SIG_OUTPUT,BCM2711_GPIO_GPFSEL0);
 25
 26     temp = readl(BCM2711_GPIO_GPFSEL1); //gpio10~13 read
 27     temp = temp & 0x3ffff000;           //gpio10~13 clear
 28     temp = temp | GPIO10_13_SIG_OUTPUT;//gpio10~13 output
 29     writel(temp,BCM2711_GPIO_GPFSEL1);  //gpio10~13 write
 30 //  writel(GPIO10_13_SIG_OUTPUT,BCM2711_GPIO_GPFSEL1);
 31 }
 32 void led_write(unsigned long led_data)
 33 {
 34     writel(0x3fc0,BCM2711_GPIO_GPCLR0);     //led all off
 35     led_data = led_data << 6;
 36     writel(led_data,BCM2711_GPIO_GPSET0);  //ledX on
 37 }
 38 void key_init(void)
 39 {
 40     unsigned long temp;
 41     temp = readl(BCM2711_GPIO_GPFSEL1);
 42     temp = temp & 0x0003ffff;           //gpio16~20 input
 43     writel(temp,BCM2711_GPIO_GPFSEL1);
 44
 45     temp = readl(BCM2711_GPIO_GPFSEL2);
 46     temp = temp & 0x3ffff000;           //gpio21~23 input
  47     writel(temp,BCM2711_GPIO_GPFSEL2);
 48 }
 49 void key_read(unsigned long * key_data)
 50 {
 51     *key_data =(readl(BCM2711_GPIO_GPLEV0) >> 16) & 0x000000ff;
 52 }
 53 static int do_KCCI_LED(struct cmd_tbl *cmdtp,int flag, int argc, char * cons    t argv[])
 54 {
 55     unsigned long led_data;
 56     unsigned long key_data;
 57     unsigned long key_data_old=0;
 58     unsigned long i;
 59     if(argc != 2)
 60     {
 61         cmd_usage(cmdtp);
 62         return 1;
 63     }
 64     printf("*LED TEST START\n");
 65     led_init();
 66     led_data = simple_strtoul(argv[1],NULL,16);
 67     led_write(led_data);
 68

 69     key_init();
 70     do {
 71         key_read(&key_data);
 72         if(key_data != key_data_old)
 73         {
 74             if(key_data)
 75             {
 76                 led_write(key_data);
 77                 puts("0:1:2:3:4:5:6:7\n");
 78                 for(i=0;i<8;i++)
 79                 {
 80                     if(key_data & (0x01 << i))
 81                         putc('O');
 82                     else
 83                         putc('X');
 84                     if(i !=7 )
 85                         putc(':');
 86                     else
 87                         putc('\n');
 88                 }
 89                 putc('\n');
 90                 key_data_old = key_data;
 91                 if(key_data == 0x80)
 92                     break;
 93             }
 94         }
 95     } while(1);
 96
 97     printf("*LED TEST END(%s : %#04x)\n\n ",argv[0],(unsigned int)key_data);
 98     return 0;
 99 }
100 U_BOOT_CMD(
101     led,2,0,do_KCCI_LED,
102     "led - kcci LED Test.",
103     "number - Input argument is only one.(led [0x00~0xff])\n");
profile
I mean

0개의 댓글