Converting .elf to .cia? How?

Discussion in '3DS - Homebrew Development and Emulators' started by xXDungeon_CrawlerXx, Oct 10, 2015.

  1. xXDungeon_CrawlerXx
    OP

    xXDungeon_CrawlerXx GBAtemp Maniac

    Member
    1,187
    510
    Jul 29, 2015
    Liverpool
    Hey Guys,

    I want to convert some .elf files to .cia files by myself and I know that I have to use makerom for it.
    But I really don't know how to use it :/

    Someone who can explain me how to build a .cia (with own Banner, Name and sound)?
    would be awesome!
     
  2. daxtsu

    daxtsu GBAtemp Guru

    Member
    5,539
    3,929
    Jun 9, 2007
    Antarctica
    If nobody beats me to it, I'll write up a mini-tutorial later (probably leaving soon for the night, so I can't do it now). It's not really difficult, just a bit tedious.
     
    JJTapia19 likes this.
  3. xXDungeon_CrawlerXx
    OP

    xXDungeon_CrawlerXx GBAtemp Maniac

    Member
    1,187
    510
    Jul 29, 2015
    Liverpool
    Would be awesome :)
     
  4. xXDungeon_CrawlerXx
    OP

    xXDungeon_CrawlerXx GBAtemp Maniac

    Member
    1,187
    510
    Jul 29, 2015
    Liverpool
    any informations about that already? :)
     
  5. Technicmaster0

    Technicmaster0 GBAtemp Psycho!

    Member
    3,068
    633
    Oct 22, 2011
    Gambia, The
    You have to use a banner tool to create banner and icon and makerom to create the final cia.
     
  6. RainThunder

    RainThunder GBAtemp Regular

    Member
    212
    133
    Jun 22, 2012
    Hanoi
  7. Chelsea_Fantasy

    Chelsea_Fantasy GBAtemp Advanced Fan

    Member
    991
    695
    Mar 25, 2014
    Cuba
    read the Nyan Cat 3DS port thread, there is an easy script
     
  8. legofan623

    legofan623 GBAtemp Fan

    Member
    418
    196
    Oct 3, 2011
    United States
    Puyallup, WA
    He knows that, but "use makerom" is easier said than done. There's a lot of stuff to consider (like rsf files) and a lot that can go wrong.
     
  9. Technicmaster0

    Technicmaster0 GBAtemp Psycho!

    Member
    3,068
    633
    Oct 22, 2011
    Gambia, The
    But you can still google it :P
    And he can always ask back if it didn't work for some reason.
     
  10. daxtsu

    daxtsu GBAtemp Guru

    Member
    5,539
    3,929
    Jun 9, 2007
    Antarctica
    Note: this post assumes you use a very recent version of makerom (makerom 0.14 should suffice: https://github.com/profi200/Project_CTR/releases). Do not copy and paste the commands you see here, read what this post says, and substitute in your own named files.

    To make your own banner (only a 2D one will be covered here), make or get a PNG file that's 256x128 in dimensions, and make or get a WAV file that's 3 seconds in length, or less, if you want a banner with sound. Then you'll want to get bannertool (https://github.com/Steveice10/bannertool, or grab the binary from https://github.com/Steveice10/citrus/tree/master/tools), and run it as follows:

    Code:
    bannertool.exe makebanner -i nameofyourpngfile.png -a nameofyourwavfile.wav -o banner.bnr
    
    If you don't want sound, I believe you can omit the -a argument (need to verify this though).

    To make your own icon, it's pretty much the same process: get a PNG file that's 48x48 in dimensions, then just run bannertool again:

    Code:
    bannertool.exe makesmdh -s "Your Game Name Here" -l "Your Game Name Here" -p "Author Name Here" -i nameofyouricon.png  -o icon.icn
    

    Then to combine it all into a CIA, you need to use makerom. You'll need an RSF file, which tells the 3DS what sort of services the program can access, what to name the game, and things like that. Here's an example one that will probably work for most homebrew programs (if the program you're trying to make a cia for already has an rsf, you might want to use that instead; it might require services that this example doesn't provide, though you could just edit this example too).

    Code:
    BasicInfo:
      Title                   : "Your Game Name Here"
      ProductCode             : "CTR-P-EDIT" # You can make this whatever you want, it doesn't have to follow the Nintendo standard
      Logo                    : Nintendo # Nintendo / Licensed / Distributed / iQue / iQueForSystem
    
    #RomFs:
      # Specifies the root path of the read only file system to include in the ROM.
    #  RootPath                : $(APP_ROMFS)
    
    TitleInfo:
      Category                : Application
      UniqueId                : 0x1337 #Something like 0x1337, but you can make it whatever you want, as long as it's a hexadecimal number (probably best to make it something actually unique though!)
    
    Option:
      UseOnSD                 : true # true if App is to be installed to SD
      FreeProductCode         : true # Removes limitations on ProductCode
      MediaFootPadding        : false # If true CCI files are created with padding
      EnableCrypt             : $(APP_ENCRYPTED) # Enables encryption for NCCH and CIA
      EnableCompress          : true # Compresses where applicable (currently only exefs:/.code)
    AccessControlInfo:
      CoreVersion                   : 2
    
      # Exheader Format Version
      DescVersion                   : 2
      # Minimum Required Kernel Version (below is for 4.5.0)
      ReleaseKernelMajor            : "02"
      ReleaseKernelMinor            : "33"
    
      # ExtData
      UseExtSaveData                : false # enables ExtData
      #ExtSaveDataId                : 0x300 # only set this when the ID is different to the UniqueId
    
      # FS:USER Archive Access Permissions
      # Uncomment as required
      FileSystemAccess:
       #- CategorySystemApplication
       #- CategoryHardwareCheck
       - CategoryFileSystemTool
       #- Debug
       #- TwlCardBackup
       #- TwlNandData
       #- Boss
       - DirectSdmc
       #- Core
       #- CtrNandRo
       #- CtrNandRw
       #- CtrNandRoWrite
       #- CategorySystemSettings
       #- CardBoard
       #- ExportImportIvs
       #- DirectSdmcWrite
       #- SwitchCleanup
       #- SaveDataMove
       #- Shop
       #- Shell
       #- CategoryHomeMenu
    
      # Process Settings
      MemoryType                    : Application # Application/System/Base
      SystemMode                    : 64MB # 64MB(Default)/96MB/80MB/72MB/32MB
      IdealProcessor                : 0
      AffinityMask                  : 1
      Priority                      : 16
      MaxCpu                        : 0x9E # Default
      HandleTableSize               : 0x200
      DisableDebug                  : false
      EnableForceDebug              : false
      CanWriteSharedPage            : true
      CanUsePrivilegedPriority      : false
      CanUseNonAlphabetAndNumber    : true
      PermitMainFunctionArgument    : true
      CanShareDeviceMemory          : true
      RunnableOnSleep               : false
      SpecialMemoryArrange          : true
    
      # New3DS Exclusive Process Settings
      SystemModeExt                 : Legacy # Legacy(Default)/124MB/178MB  Legacy:Use Old3DS SystemMode
      CpuSpeed                      : 256MHz # 256MHz(Default)/804MHz
      EnableL2Cache                 : true # false(default)/true
      CanAccessCore2                : true
    
      # Virtual Address Mappings
      IORegisterMapping:
       - 1ff00000-1ff7ffff   # DSP memory
      MemoryMapping:
       - 1f000000-1f5fffff:r # VRAM
    
      # Accessible SVCs, <Name>:<ID>
      SystemCallAccess:
        ArbitrateAddress: 34
        Backdoor: 123
        Break: 60
        CancelTimer: 28
        ClearEvent: 25
        ClearTimer: 29
        CloseHandle: 35
        ConnectToPort: 45
        ControlMemory: 1
        ControlProcessMemory: 112
        CreateAddressArbiter: 33
        CreateEvent: 23
        CreateMemoryBlock: 30
        CreateMutex: 19
        CreateSemaphore: 21
        CreateThread: 8
        CreateTimer: 26
        DuplicateHandle: 39
        ExitProcess: 3
        ExitThread: 9
        GetCurrentProcessorNumber: 17
        GetHandleInfo: 41
        GetProcessId: 53
        GetProcessIdOfThread: 54
        GetProcessIdealProcessor: 6
        GetProcessInfo: 43
        GetResourceLimit: 56
        GetResourceLimitCurrentValues: 58
        GetResourceLimitLimitValues: 57
        GetSystemInfo: 42
        GetSystemTick: 40
        GetThreadContext: 59
        GetThreadId: 55
        GetThreadIdealProcessor: 15
        GetThreadInfo: 44
        GetThreadPriority: 11
        MapMemoryBlock: 31
        OutputDebugString: 61
        QueryMemory: 2
        ReleaseMutex: 20
        ReleaseSemaphore: 22
        SendSyncRequest1: 46
        SendSyncRequest2: 47
        SendSyncRequest3: 48
        SendSyncRequest4: 49
        SendSyncRequest: 50
        SetThreadPriority: 12
        SetTimer: 27
        SignalEvent: 24
        SleepThread: 10
        UnmapMemoryBlock: 32
        WaitSynchronization1: 36
        WaitSynchronizationN: 37
    
      # Service List
      # Maximum 34 services (32 if firmware is prior to 9.6.0)
      ServiceAccessControl:
       - APT:U
       - ac:u
       - am:net
       - boss:U
       - cam:u
       - cecd:u
       - cfg:nor
       - cfg:u
       - csnd:SND
       - dsp::DSP
       - frd:u
       - fs:USER
       - gsp::Gpu
       - hid:USER
       - http:C
       - ir:rst
       - ir:u
       - ir:USER
       - mic:u
       - ndm:u
       - news:u
       - nwm::UDS
       - ptm:u
       - pxi:dev
       - soc:U
       - ssl:C
       - y2r:u
    
    
    SystemControlInfo:
      SaveDataSize: 0KB # Change if the app uses savedata
      RemasterVersion: 2
      StackSize: 0x40000
    
      # Modules that run services listed above should be included below
      # Maximum 48 dependencies
      # <module name>:<module titleid>
      Dependency:
        ac: 0x0004013000002402
        #act: 0x0004013000003802
        am: 0x0004013000001502
        boss: 0x0004013000003402
        camera: 0x0004013000001602
        cecd: 0x0004013000002602
        cfg: 0x0004013000001702
        codec: 0x0004013000001802
        csnd: 0x0004013000002702
        dlp: 0x0004013000002802
        dsp: 0x0004013000001a02
        friends: 0x0004013000003202
        gpio: 0x0004013000001b02
        gsp: 0x0004013000001c02
        hid: 0x0004013000001d02
        http: 0x0004013000002902
        i2c: 0x0004013000001e02
        ir: 0x0004013000003302
        mcu: 0x0004013000001f02
        mic: 0x0004013000002002
        ndm: 0x0004013000002b02
        news: 0x0004013000003502
        #nfc: 0x0004013000004002
        nim: 0x0004013000002c02
        nwm: 0x0004013000002d02
        pdn: 0x0004013000002102
        ps: 0x0004013000003102
        ptm: 0x0004013000002202
        #qtm: 0x0004013020004202
        ro: 0x0004013000003702
        socket: 0x0004013000002e02
        spi: 0x0004013000002302
        ssl: 0x0004013000002f02
    
    
    Anyway, now you're ready to build the cia. Use makerom:

    Code:
    makerom -f cia -o install-me.cia -DAPP_ENCRYPTED=false -rsf rsffilename.rsf -target t -exefslogo -elf yourelffilename.elf -icon icon.icn -banner banner.bnr
    
    If you want to spit out a .3ds file instead, it's more or less the same:
    Code:
    makerom -f cci -o runme.3ds -DAPP_ENCRYPTED=true -rsf rsffilename.rsf -target t -exefslogo -elf yourelffilename.elf -icon icon.icn -banner banner.bnr
    
    That's about it.
     
    Last edited by daxtsu, Oct 11, 2015
  11. xXDungeon_CrawlerXx
    OP

    xXDungeon_CrawlerXx GBAtemp Maniac

    Member
    1,187
    510
    Jul 29, 2015
    Liverpool
    THANK YOU!
     
  12. daxtsu

    daxtsu GBAtemp Guru

    Member
    5,539
    3,929
    Jun 9, 2007
    Antarctica
    You're welcome. I hope it helps.
     
  13. xXDungeon_CrawlerXx
    OP

    xXDungeon_CrawlerXx GBAtemp Maniac

    Member
    1,187
    510
    Jul 29, 2015
    Liverpool
    It worked very well :) Thank you again
     
    daxtsu likes this.
  14. xXDungeon_CrawlerXx
    OP

    xXDungeon_CrawlerXx GBAtemp Maniac

    Member
    1,187
    510
    Jul 29, 2015
    Liverpool
    Okay, got a little problem.
    Tried to use a sound for my built cia (.wav file, size: 380kb, length: 3sec, bitrate: 1024kbit/s).
    But I only hear a few beeps when using it.
    here's the wav I use: http://www.xup.in/dl,13612937/audio.wav/

    is it possible to get it to work?
     
    Last edited by xXDungeon_CrawlerXx, Oct 12, 2015
  15. elhobbs

    elhobbs GBAtemp Advanced Fan

    Member
    783
    292
    Jul 28, 2008
    United States
    Not an expert, but that seems like a really high bitrate for a 3ds. That wav file is enourmous.
     
  16. Voxel

    Voxel Clumsy Coder

    Member
    GBAtemp Patron
    Voxel is a Patron of GBAtemp and is helping us stay independent!

    Our Patreon
    5,182
    5,842
    Jun 27, 2015
    United Kingdom
    England, UK
    Usually, the wav files have to consist of the following properties to actually work on a 3DS:
    • It needs to be stereo.
    • It needs to be no more than 3 seconds long.
    • The frequency has to be 32000Hz.
    • And the bitrate need to be 32-bit float.
    (These are my findings from a couple of months back, anyway...)
     
  17. Logan Pockrus

    Logan Pockrus Knawledge is key.

    Member
    1,339
    1,020
    Jan 1, 2016
    United States
    I constantly get:


    [EXHEADER ERROR] Invalid cpu speed: 0x256MHz
    [EXHEADER ERROR] Failed to create ExHeader
    [NCCH ERROR] NCCH Build Process Failed
    [RESULT] Failed to build outfile

    Any fix?
     
  18. daxtsu

    daxtsu GBAtemp Guru

    Member
    5,539
    3,929
    Jun 9, 2007
    Antarctica
    Should be 268Mhz now, if you're using the latest makerom, and no need for the "0x" part, it's not a hexadecimal number.
     
  19. DarkFlare69

    DarkFlare69 GBAtemp Psycho!

    Member
    4,686
    2,512
    Dec 8, 2014
    United States
    Ohio
    i made a video tutorial + a batch file to do it all
     
    Manlydonut likes this.